Linux
用兩個 $ 符號之間的另一個字元串替換字元串
我有一個包含這樣內容的文件。
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``$``\)``$