- ベストアンサー
sedで文字列の一部を取り出す方法
- sedコマンドを使用して、文字列の一部を取り出したい場合、正規表現を使用してパターンを指定することができます。
- 提供された質問の例では、指定のファイルから特定のパターンを条件として抽出する方法を説明しています。
- ただし、正規表現のパターンが期待した結果を返さない場合、パターン自体や入力データのフォーマットを確認することが重要です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
No.3 さんに賛成なんだけど、最新の Solaris ではどうか知らないけど ; (マルチステートメント) 使えないので、 sed -e 's/"\([A-Z0-9][A-Z0-9]*\)".*$/\1/' -e 's/^.*,//' aaa みたいにするか、ファイルにスクリプトとして1行づつ書いて -f scriptfile 指定するとかしないといけない気がします。GNU sed 使える環境なら然にあらず。 あと良く使ったのが文中に出てこない文字でマーク付けておいてから、後でいらない部分を消去する方法。 sed -n -e 's/"\([A-Z0-9]*[0-9]\)"/:\1:/1' -e 's/^[^:]*://' -e 's/:.*$//p' aaa /1 の部分を /2 とかすると2番目にマッチした部分を対象に。 : は良く改行コード \n 使ったりするんだけど、sed によってはエスケープ使えずコード自体書かないといけなかったりする。多分 Solaris の sed も
その他の回答 (4)
- asciiz
- ベストアンサー率70% (6803/9674)
- M_Sato
- ベストアンサー率54% (550/1003)
以下のように、最初に後ろを切って、次にカンマから前を切ったらどうでしょう。これなら求めるデータがどの位置にあっても適応できると思います。 s/"\([A-Z0-9][A-Z0-9]*\)".*$/\1/;s/^.*,//
お礼
ありがとうございます。 たしかに、取り出したい文字列以降を捨ててしまえばできます
補足
>たしかに、取り出したい文字列以降を捨ててしまえばできます マルチステートメント? で、最初に後ろを切ってしまうということだったですね。 内容をよく確認せずまちがった返事でした。 マルチステートメント使えませんです。
- Wap58
- ベストアンサー率33% (29/87)
sed -r 's/.+?,"([A-Z0-9]+)",.+$/\1/' aaa 手元に実行環境ないけど これでいけんじゃないの?
お礼
ありがとうございます。 確認させてただきます。
補足
Linuxでためしてみましたが、できませんでした。 2番目が出力されます。
- asciiz
- ベストアンサー率70% (6803/9674)
「.*」は、任意の文字、0文字でも何文字にでもマッチしてしまうので、安易に使ってはいけません。 特にマッチ文字列中でいくつも使うと、最初のものから最長になるようにマッチします。 今回の例では、最初の「.*,」の部分が「"aaa","bbb","ccc","123456","ddd","eee","fff",」にまでマッチするから、"0000"が取り出されてしまうというわけです。 さてそこで、任意文字にマッチしてしまう「.」ではなく、「カンマ以外」を示す「[^,]」を使ってみましょう。 sed 's/^[^,]*,[^,]*,[^,]*,"\([^,]*\)",.*/\1/g' aaa これで、カンマ区切りの「第4項目」を取り出せるんじゃないでしょうか。 まあ、文字列にカンマが含まれる場合はこれでも困りますけどね…。 sedはダブルクォーテーションの対応なんか気にしないので、項目区切りのカンマだろうが文字列中のカンマだろうが同一視してしまいます…。
お礼
ありがとうございます。 期待した結果となりました。 しかし、呪文のようですね。
お礼
ありがとうございます。 いろいろと方法を記載してありがとうございます。 1回ですましてしまおうとして、2回実行することには気がつきませんでした。 参考になります。