• ベストアンサー

シェルスクリプトである文字列から一定の文字列を取得する方法

cshのスクリプトを書いているのですが、ある文字列から文字列を取得するにはどうしたらよいでしょうか? 具体的には、 aaaaaaabbbbb という文字列があってここから aaaaaaa だけ取り出すには どうすればよいでしょうか? ただし、aの文字は可変でbは固定の文字列です。

質問者が選んだベストアンサー

  • ベストアンサー
  • mph
  • ベストアンサー率54% (39/72)
回答No.3

補足されたので補足返しというこって 最後のbbbの部分の文字列長が固定でないとすると sed 's/[b]*$//g' でいけるはず。 もめるのももともとの文字列フォーマットがあきらかでないからだと思うので、文字列フォーマットを説明できる程度によく考えましょう。 それを正規表現にできれば(shell,sed)スクリプトなどできたも同然です。awkやperlで制御構造をもたせる場合はもう少しかかりますが。 今後のためにも正規表現を勉強しましょう。

その他の回答 (2)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

No.1 の回答を(勝手に (^^;)補足します。 basename コマンドは、パスからファイル名を取り出す目的で作られているので、 "/" があると、それより前の文字を削除します。なので、 % basename aaa/ccccccbbbbb bbbbb cccccc となります。質問にある「aの文字は可変」が "/" を含まない場合じゃないと 使えません。 また、sed を使うケースとして挙げられた mph> echo "aaaaaaabbbbb" | sed 's/b//g' は、「b を全て削除する」という形です。 文字列のお尻に決った文字があって、それを削除する、の一般的な形は % echo "aaaaaaabbbbb" | sed 's/bbbbb$//' となります。 これだけじゃああんまりなんで、無理矢理、私のオリジナルの回答をつけておきましょう。 awk を使うケースです。 % echo "aaaaaaabbbbb" | awk '{ sub( /bbbbb$/, "" ) ; print }' # ちなみに、私が同じ立場にあれば、迷わず sed を使います

  • mph
  • ベストアンサー率54% (39/72)
回答No.1

shellのビルトインだけでやる場合はパスします。 bbbbbの部分がファイル名の拡張子などのように文字と長さの両方が固定した文字の場合はbasename使えばできると思います。 basename aaaaaaabbbbb bbbbb もし、bbbbbが文字固定かつ長さ不定の場合はsedでできます。 echo "aaaaaaabbbbb" | sed 's/b//g' でどないでしょ? 文字列フォーマットの情報が乏しいので確信をもってアドバイスできません。

関連するQ&A

  • VBスクリプト 文字列操作

    VBスクリプト(全くの初心者です)について教えてください。 例えば "test.csv" にて 1,a 1,b 1,c 1,d 2,a 2,b 3,d 3,e 4,a 4,f 4,g のファイルがあるとします。 最初の1列目の数字(文字列)の行数は可変です。 最終的に "test2.csv" 1,a,b,c,d 2,a,b 3,d,e 4,a,f,g というファイルを作りたいのですが,ずばりコードを教えていただけないでしょうか。

  • 文字列中からある文字列とある文字列の間にある文字列を取得

    表題にあるとおり間の文字列をどうやって取得するべきかと悩んでいます・・ abcdefghijklmn・・・ となっているとき bとe、aとkなど間の間隔が不定なときはどのようにして文字列を取得したらよいのでしょうか? 最初の2文字は与えられているとして考えています。 インターネットのURLで言うなら/から/までの間の文字列と言うことになります。 今私が考えているのは strchrで位置のアドレスを取得してそこからfor文かwhile文で指定の2文字目が出るまでまわすのかなぁ・・と思っています。 ですが具体的にどのような感じに書けばいいのかがわかりません。どなたかご教授ください。

  • シェルの文字列取得について

    シェル(Bash)の文字列取得についてご教授ください。 文字列:  test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。

  • シェルスクリプトで読み込んだ文字列の区切り文字以降の文字列を取得したい

    ちょっと説明が難しいのですが aaa = bbb こういう文字列の右側のbbbを取り出したいのですが可能ですか? 全てこのようなら問題ないのですが、前後のスペースに問題があります _aaa = bbb や aaa=bbb aaa =__bbb アンダーバーはスペースのかわりです。 のように前後にスペースが1つ2つ入っていたり抜けていたりします。 aaa = bbb だったら i=`echo | sed 's/aaa\ =\ //'` のようにして取得できていますが、その他の処理がうまくできません そもそもシェルスクリプトでこのような処理は無理なのでしょうか? perl ではできたのですができればシェルスクリプトで完結させたいのです。 よろしくお願いします。 使っているシェルはzshです。

  • エクセル マクロ 文字列からの行数の取得

    エクセルでマクロ初心者です。よろしくお願いします。例えば1列目にデータ名が入力されていてその個数が可変である場合(小計は末尾ではありません)小計行の1列目から数式をいれたいのですが、行数が固定でないため小計と書かれたセルの行数を取得したいのですが、わかりません。いい方法をお願いします。    A B C D データ aa bb cc 小計 ・ ・

  • bashスクリプトでの文字列から特定文字列の位置特定

    bashスクリプトで 文字列から特定の文字の位置を取得する場合 expr index 文字列 特定したい文字 のように書きますが、aaa_atestという文字列から "atest"という文字列の開始位置を取得する ことはできません 何か方法はないのでしょうか

  • シェルスクリプトでファイル内の数値文字列を数値として扱うには

    失礼します。 シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか? str:ファイル内のテキスト(数値文字列) res=$(( $str + 1 )) ・エラー ")syntax error: invalid arithmetic operator (error token is " よろしくお願いします。

  • スクリプト言語で文字列を囲む "" '' の厳密な使い分け?

    スクリプト言語、Perl, PHP, Pythonでよく a = "文字列" b = '文字列' のように、ダブルとシングルが使われますが、 サンプル等は''シングルが多いですが、私は元々VBをよく使っていたので、""の方が馴染みます。 ''との違いは""は中で変数が展開されることだと思いますが それ以外で使い分ける厳密な理由はありますか?

    • 締切済み
    • PHP
  • エクセルでA列にある文字が含まれている時、そのB列に固定文字を追加したい。

    エクセルでA列にある文字が含まれている時、そのB列に固定文字を追加したい。 例) A列に東京の文字があれば、そのB列に固定文字を追加する。   A       B 1 東京都港区 2 大阪府 3 東京都    B列の元文字      2 大阪府 ※ B列にすでに文字があるときは、固定文字を前に追加したい。例)固定文字+B列の元文字 ※ B列に文字がなければ、固定文字のみを入れたい。 実行例   A       B 1 東京都港区 固定文字 2 大阪府 3 東京都    固定文字 B列の元文字  エクセルマクロでできる方法を教えてください。 宜しくお願い致します。

  • 文字列の取得について

    Accessのモジュールを使ってある文字列から指定した文字数の文字列を取得しようとしています。 A:"あああああ" & vbcrlf B:"いいいいい" & vbcrlf C:"うううううう" & vbcrlf D:"えええええ" & vbcrlf A~Dまでフィールドがあり、vbcrlfは改行です。 この文字列に対して以下の処理を実行します。 (1)変数mojiにA & B & C & Dを代入 (2)mojiを全角に変換 (3)Left(moji,20)で左から20文字取得します。 (4)mojiをテキストボックスに登録します。 (5)入力チェック処理  ・フィールドサイズが20文字以内か?  ・全角で登録されているか? →登録後のイメージ ---------------- あああああ いいいいい ううううう ---------------- テキストボックスには全角でしっかり登録されているようにみえるのですが、 どうしても全角で登録してくださいというメッセージが表示されてしまいます。 うううううの次の改行を削除すると、メッセージはでなくなります。 この改行が半角になっているのでしょうか? アドバイスよろしくお願いいたします。