プロが教えるわが家の防犯対策術!

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

A 回答 (3件)

補足されたので補足返しというこって



最後のbbbの部分の文字列長が固定でないとすると

sed 's/[b]*$//g'

でいけるはず。

もめるのももともとの文字列フォーマットがあきらかでないからだと思うので、文字列フォーマットを説明できる程度によく考えましょう。

それを正規表現にできれば(shell,sed)スクリプトなどできたも同然です。awkやperlで制御構造をもたせる場合はもう少しかかりますが。
今後のためにも正規表現を勉強しましょう。
    • good
    • 0

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 を使います
    • good
    • 0

shellのビルトインだけでやる場合はパスします。



bbbbbの部分がファイル名の拡張子などのように文字と長さの両方が固定した文字の場合はbasename使えばできると思います。

basename aaaaaaabbbbb bbbbb

もし、bbbbbが文字固定かつ長さ不定の場合はsedでできます。

echo "aaaaaaabbbbb" | sed 's/b//g'

でどないでしょ?

文字列フォーマットの情報が乏しいので確信をもってアドバイスできません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!