サーチ…
シェル変数を使用した置換
単一引用符内の変数は'
POSIX互換のシェルで展開されませんので、シェル変数使用してsed
置換は、二重引用符を使用する必要があり"
の代わりに、単一引用符を'
:
$ var="he"
$ echo "hello" | sed "s/$var/XX/"
XXllo
$ var="he"
$ echo "hello" | sed 's/$var/XX/'
hello
変数を評価するときは、コマンド注入に注意してください。
$ var='./&/;x;w/etc/passwd
> x;s/he'
$ echo "hello" | sed "s/$var/XX/"
sed: /etc/passwd: Permission denied
上記がrootとして実行された場合、最初の例と出力を区別できず、 /etc/passwd
内容は破棄されます。
逆参照
エスケープした角括弧を使用すると、置換文字列\1
で逆参照できるパターンでキャプチャグループを定義できます。
$ echo Hello world! | sed 's/\(Hello\) world!/\1 sed/'
Hello sed
複数のグループの場合:
$ echo one two three | sed 's/\(one\) \(two\) \(three\)/\3 \2 \1/'
three two one
拡張正規表現( 追加オプションを参照)を使用する場合、括弧はデフォルトでグループ化を行い、エスケープする必要はありません。
$ echo one two three | sed -E 's/(one) (two) (three)/\3 \2 \1/'
three two one
文字、数字、およびアンダースコアで構成される単語は、 [[:alnum:]_]\{1,\}
という式を使用して一致させることができます。
$ echo Hello 123 reg_exp | sed 's/\([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\) \([[:alnum:]_]\{1,\}\)/\3 \2 \1/'
reg_exp 123 Hello
シーケンス\w
は、 [[:alnum:]_]
と等価[[:alnum:]_]
$ echo Hello 123 reg_exp | sed 's/\(\w\w*\) \(\w\w*\) \(\w\w*\)/\3 \2 \1/'
reg_exp 123 Hello
異なるデリミタを使用する
POSIX / IEEE Open Group Base仕様書によると :
[2addr] s / BRE / replacement / flags
パターンスペース内のBREのインスタンスを置換文字列に置き換えます。 バックスラッシュまたは改行以外の文字をスラッシュの代わりに使用して、BREと置換文字を区切ることができます。 BREと置換え内では、バックスラッシュが前に付いている場合は、BRE区切り文字自体をリテラル文字として使用できます。
区切り文字がある場合もあります/
のためのsed
交換のようなエラーをトリガ、BREまたは交換です。
$ echo "2/3/4" | sed "s/2/3/X/"
sed: -e expression #1, char 7: unknown option to `s'
このために、 #
や_
、さらにはスペースなどの異なるデリミタを使用できます。
$ echo "2/3/4" | sed "s#2/3#X#"
X/4
$ echo "2/3/4" | sed "s_2/3_X_"
X/4
$ echo "2/3/4" | sed "s 2/3 X "
X/4
パターンフラグ - オカレンス置換
行中の最初のオカレンスだけを置き換えたい場合は、通常どおりsed
を使用します。
$ cat example
aaaaabbbbb
aaaaaccccc
aaaaaddddd
$ sed 's/a/x/' example
xaaaabbbbb
xaaaaccccc
xaaaaddddd
しかし、すべての出来事を置き換えたいのであればどうでしょうか?
最後にg
パターンフラグを追加するだけです:
$ sed 's/a/x/g' example
xxxxxbbbbb
xxxxxccccc
xxxxxddddd
特定のオカレンスを置き換える場合は、実際に特定のオカレンスを指定することができます。
$ sed 's/a/x/3' example
aaxaabbbbb
aaxaaccccc
aaxaaddddd
/3
が3回目の出現である。
info sed
から、オンラインバージョンのGNU sedマニュアルを参照してください。
POSIX標準では、
g
修飾子とNUMBER修飾子を混在させるときに何が起こるべきかを指定していません。現在、sed
実装全体で広く合意された意味はありません。 GNUsed
場合、相互作用は次のように定義されます:NUMBERthの前に一致を無視し、NUMBERthのすべての一致をマッチして置き換えます。
$ sed 's/b/y/2g' example
aaaaabyyyy
aaaaaccccc
aaaaaddddd
$ sed 's/c/z/g3' example
aaaaabbbbb
aaaaacczzz
aaaaaddddd