サーチ…


シェル変数を使用した置換

単一引用符内の変数は' 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
BSD sed GNU sed

拡張正規表現( 追加オプションを参照)を使用する場合、括弧はデフォルトでグループ化を行い、エスケープする必要はありません。

$ 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
GNU sed

シーケンス\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回目の出現である。


GNU sed

info sedから、オンラインバージョンのGNU sedマニュアルを参照してください。

POSIX標準では、 g修飾子とNUMBER修飾子を混在させるときに何が起こるべきかを指定していません。現在、 sed実装全体で広く合意された意味はありません。 GNU sed場合、相互作用は次のように定義されます:NUMBERthの前に一致を無視し、NUMBERthのすべての一致をマッチして置き換えます。

$ sed 's/b/y/2g' example
aaaaabyyyy
aaaaaccccc
aaaaaddddd

$ sed 's/c/z/g3' example
aaaaabbbbb
aaaaacczzz
aaaaaddddd


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow