我有一个包含这样内容的文件。
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
$
是一个特殊的正则表达式运算符,匹配主题末尾。要匹配文字$
字符,您需要使用\$
or[$]
来替代。
显式替换$token$
s:
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
$
\)
$