使用 sed 查找整個單字並替換

使用 sed 查找整個單字並替換

我的文件中有以下文字區塊:

test3.legacy test4.legacy test3 test3.kami

我只想test3整體搜索並用任何東西替換它。不幸的是,我所有的嘗試都被刪除了測試3test3.legacytest3.kami。我試過了:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

沒有任何運氣。我有什麼想法可以解決這個問題嗎?

編輯:大多數嘗試的結果如下:.legacy test4.legacy .kami

答案1

這是你想要的嗎?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

這說

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

更新:

正如好人優雅地表達的那樣@史蒂芬·查澤拉斯這不能解決某些情況。還要強調便攜性部分。看回答如下

GNU 變體可以,(希望), 是:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

處理重複的比賽。或者,一個人也可以處理多個空間等。取決於輸入。

歐普德


作為替代方案也許(僅作為起點):

sed 's/\Wtest3\W/ /g'

我認為不是這個:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

答案2

給定您的範例,我會尋找兩側用空格包裹的 test3,\s而不是嘗試使用單字邊界符號。

例如

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

上面尋找的是空間測試3空間並將其替換為空間

筆記:這無法處理 test3 位於列表中第一個的情況!

答案3

便攜:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

那是:

  • 首先在行首和行尾加上一個空格,這樣就不用特別考慮test3行首和行尾,
  • 將空格內的內容替換test3為單一空格,
  • 只要有替換(以覆蓋情況test3 test3),就重複此過程。
  • 刪除我們最初新增的前導和尾隨空格。

答案4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

請嘗試以上

相關內容