Sed

sed 單詞邊界不適用於冒號字元

  • December 4, 2021

我有以下文件

> cat tmp
"aaa"
"aaa:xyz"

所需的輸出是

"bbb"
"aaa:xyz"

我正在使用以下 sed 命令

sed "s/\baaa\b/bbb/" tmp

但是有了這個命令,我得到了

"bbb"
"bbb:xyz"

冒號字元似乎被視為單詞邊界。如何在只有第一行而不是第二行更改的情況下獲得所需的輸出?我什至嘗試了以下但沒有效果

sed "s/\Baaa\B/bbb/" tmp
sed "s/\baaa\B/bbb/" tmp
sed "s/\Baaa\b/bbb/" tmp

編輯:我必須像這樣在同一個文件上使用其他 sed 命令

's/aaa:xyz/ttt/' tmp

所以,只有在沒有冒號的情況下,我才能進行替換。無論行中是否存在冒號,我都應該能夠進行替換

GNU\b零寬度單詞邊界模式匹配單詞字元和非單詞字元。“單詞字元”通常是任何字母數字字元和下劃線 ( _)。這意味著它將在字元串\b之間匹配。aaa``:``aaa:

下面\b通過替換所有匹配項來說明範例文件中的匹配\b*

$ sed 's/\b/*/g' file
"*aaa*"
"*aaa*:*xyz*"

"aaa"要替換with的所有實例"bbb",請使用

$ sed 's/"aaa"/"bbb"/g' file
"bbb"
"aaa:xyz"

用不包含冒號的任何行替換所有單詞: aaa``bbb

$ sed '/:/!s/\baaa\b/bbb/g' file
"bbb"
"aaa:xyz"

用 替換所有aaa後跟不是冒號的單詞bbb

$ sed -e 's/\baaa\([^:]\)/bbb\1/g' -e 's/\baaa$/bbb/' file
"bbb"
"aaa:xyz"

請注意,這裡的第一次替換要求**子字元串aaa後跟另一個字元。這意味著子字元串不會在行的最末端被替換。這就是為什麼我們對這種情況進行單獨的替換。aaa

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