
誰もが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