Sedのグループ化ワークフロー

Sedのグループ化ワークフロー

誰もがsedグループ化がどのように機能するかを説明できますか? 「Sed and Awk 101」という本をフォローしています。

この概念は私にとって不思議なようです。

答え1

例:

$ FOO="1234567890 one two three ABCDEF"
$ echo "$FOO" | sed "s|\(1.*0\).*\(A.*F\)|\2 \1|"
ABCDEF 1234567890

=> SEDに一致させて、\(1.*0\).*\(A.*F\)次に変更するように指示します。group2 group1

グループステートメントは\(次から始まり、終了します。\)

  • \(1.*0\)「1」で始まり、「0」で終わるすべてのパターンと一致してグループ1になります。

  • .*複数文字の一致(すべてのタイプ)

  • \(A.*F\)「A」で始まり、「F」で終わるすべてのパターンと一致してグループ2になります。

グループは、たとえば\ Nに置き換えることができます。ここで、Nはグループ番号です。

  • \1グループ1なので、ここは「1234567890」です。

  • \2グループ2なので、ここは「ABCDEF」です。

答え2

グループ化は()通常、後で置き換えられる(正規表現)部分を使用して実行されます。

デフォルトの正規表現を使用して()特別な意味を得るには、エスケープする必要があります\(stuff\)。例えば

echo "Bash Pitfalls" | sed -E 's/Pit(falls)/\1/'

あなたのため

Bash falls

-E拡張正規表現を有効にすると、エスケープする必要はありません()

明らかにこれはうまく使用されておらず、()より実用的な用途は()ワイルドカードを発生と組み合わせることです。

  • {}パターンの発生回数を計算するために使用されます。拡張正規表現がない場合は、次のようにする必要があります\{\}
  • sedの内容は[]言及範囲です。たとえば、[0-9]0から9までの数字、[a-z]aからzまでのすべての文字などと一致します。

より実用的な例

$ echo "Match" | sed -E 's/([HM]{1}at)ch/\1/'
Mat
$ echo "Hatch" | sed -E 's/([HM]{1}at)ch/\1/' 
Hat
$ echo "Catch" | sed -E 's/([HM]{1}at)ch/\1/'
Catch 

関連情報