将字符串替换为两个 $ 符号之间的另一个字符串

将字符串替换为两个 $ 符号之间的另一个字符串

我有一个包含这样内容的文件。

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$\)$

相关内容