• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:sedで「(~)」を使って文字列の一部を取り出し)

sedで文字列の一部を取り出す方法

このQ&Aのポイント
  • sedコマンドを使用して、文字列の一部を取り出したい場合、正規表現を使用してパターンを指定することができます。
  • 提供された質問の例では、指定のファイルから特定のパターンを条件として抽出する方法を説明しています。
  • ただし、正規表現のパターンが期待した結果を返さない場合、パターン自体や入力データのフォーマットを確認することが重要です。

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

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

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 も

abc999xyz
質問者

お礼

ありがとうございます。 いろいろと方法を記載してありがとうございます。 1回ですましてしまおうとして、2回実行することには気がつきませんでした。 参考になります。

その他の回答 (4)

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.5

>しかし、呪文のようですね。 行頭を表す「^」と[ ]内部の否定を表す^、カンマ区切りとカンマ以外を示すための「,」が入り組んでいるのでパッと見訳わかりませんね(笑 私は、添付図のように考えました。 マッチした4番目の文字列で、行全体を置き換えるので、第4項目を取り出せます。 この正規表現では「データにカンマが含まれないものに限る」という条件が付くのも理解できるかと…。

abc999xyz
質問者

お礼

ありがとうございます。 詳細な説明を解説図付きでありがとうございます。 勉強になります。

  • M_Sato
  • ベストアンサー率54% (550/1003)
回答No.3

以下のように、最初に後ろを切って、次にカンマから前を切ったらどうでしょう。これなら求めるデータがどの位置にあっても適応できると思います。 s/"\([A-Z0-9][A-Z0-9]*\)".*$/\1/;s/^.*,//

abc999xyz
質問者

お礼

ありがとうございます。 たしかに、取り出したい文字列以降を捨ててしまえばできます

abc999xyz
質問者

補足

>たしかに、取り出したい文字列以降を捨ててしまえばできます マルチステートメント? で、最初に後ろを切ってしまうということだったですね。 内容をよく確認せずまちがった返事でした。 マルチステートメント使えませんです。

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.2

sed -r 's/.+?,"([A-Z0-9]+)",.+$/\1/' aaa 手元に実行環境ないけど これでいけんじゃないの?

abc999xyz
質問者

お礼

ありがとうございます。 確認させてただきます。

abc999xyz
質問者

補足

Linuxでためしてみましたが、できませんでした。 2番目が出力されます。

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

「.*」は、任意の文字、0文字でも何文字にでもマッチしてしまうので、安易に使ってはいけません。 特にマッチ文字列中でいくつも使うと、最初のものから最長になるようにマッチします。 今回の例では、最初の「.*,」の部分が「"aaa","bbb","ccc","123456","ddd","eee","fff",」にまでマッチするから、"0000"が取り出されてしまうというわけです。 さてそこで、任意文字にマッチしてしまう「.」ではなく、「カンマ以外」を示す「[^,]」を使ってみましょう。 sed 's/^[^,]*,[^,]*,[^,]*,"\([^,]*\)",.*/\1/g' aaa これで、カンマ区切りの「第4項目」を取り出せるんじゃないでしょうか。 まあ、文字列にカンマが含まれる場合はこれでも困りますけどね…。 sedはダブルクォーテーションの対応なんか気にしないので、項目区切りのカンマだろうが文字列中のカンマだろうが同一視してしまいます…。

abc999xyz
質問者

お礼

ありがとうございます。 期待した結果となりました。 しかし、呪文のようですね。

関連するQ&A