このような内容のファイルがあります。
hello , welcome
name is $foo$
bye bye
こうして$foo$
交換したいです。bar
hello , welcome
name is bar
bye bye
図のように周囲のドル記号も削除したいです。
私は次のことを試してきました。
sed -i 's/$.*$/$foo$/g’
答え1
その間のすべての項目と$
それ以降の次の項目を置き換えるには、次のようにします。$
bar
sed 's/\$[^$]*\$/bar/g' < file
$
トピックの終わりに一致する特殊正規表現演算子です。リテラル文字を一致させるには、代わりにまたはを$
使用する必要があります。\$
[$]
sを明示的に変更します$token$
。
sed '
s/\$foo\$/bar/g
s/\$abc\$/xyz/g
' < file
perl
大きなリストの場合は、次のことをお勧めします。
perl -p -e '
BEGIN {
%map = qw(
$foo$ bar
$abc$ xyz
$xyz$ abc
);
$regexp = join "|", map {qr{\Q$_\E}} keys %map;
}
s/$regexp/$map{$&}/g' < file
厳密に言うと、基本正規表現( の基本正規表現;一部の実装では、一部、、、、、sed
...を使用して別のスタイルに切り替える)の場合は、パターンの終わりまたはaの前(もっと多くの場合)にのみ適用されます。多くは、BREの特別サポート拡張です。したがって、上記では最後の項目だけを脱出するだけです。それでも必ずしも必要でないときに脱出しても何の害もなく、特殊なケースを覚えているよりも簡単です。-E
-r
-R
-P
-X
-A
$
\)
$