Linux

用兩個 $ 符號之間的另一個字元串替換字元串

  • October 8, 2020

我有一個包含這樣內容的文件。

hello , welcome
name is $foo$
bye bye

我想$foo$bar這樣的替換。

hello , welcome
name is bar
bye bye

如圖所示,我還想刪除周圍的美元符號..

我一直在嘗試這樣的事情:

sed -i 's/$.*$/$foo$/g’

要用替換$之後的所有內容,你可以這樣做:$``bar

sed 's/\$[^$]*\$/bar/g' < file

$是一個特殊的正則表達式運算符,匹配主題的末尾。要匹配文字$字元,您需要\$[$]取而代之¹。

要顯式替換$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

¹ 嚴格來說,對於基本的正則表達式(預設的正則表達式;一些實現方式使用 some , , , , , …sed切換到不同的風格),僅在模式末尾或 a 之前是特殊的(對於那些可能更多支持 BRE 中的擴展)。所以在上面,你只需要逃避最後一個. 儘管如此,在不必要的時候逃跑並沒有什麼壞處,而且比必須記住特殊的極端情況更容易。-E``-r``-R``-P``-X``-A``$``\)``$

引用自:https://unix.stackexchange.com/questions/613532