• ベストアンサー

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

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