我正在使用 centos 7. sed 命令來替換對我不起作用的第二次出現。我嘗試了以下解決方案 - Sed 在第二次出現時替換 Sed/Awk 以洗掉第二 次出現的字串 - 平臺無關sed:如何洗掉檔案中的第二個匹配項 https://unix.stackexchange.com/questions/18303/sed-delete -所有出現的字串除外第一個
該檔案-
this
foo
is
a test
file
this
foo
我正在嘗試運行 -
sed 's/foo/bar/2g' file
sed 's/foo/bar/2' file
sed -i 's/foo/bar/2g' file
我希望用第二個中的“bar”替換所有出現的“foo”。
uj5u.com熱心網友回復:
這將對包含指定模式 ( /foo/)的第二行和所有后續行執行替換:
sed ':1; /foo/! { n; b1 }; :2; n; s/foo/bar/; b2' file
它有兩個部分:
:1; /foo/! { n; b1 };是一個回圈,讀取行并保持不變地輸出它們,直到遇到第一個匹配/foo/.:2; n; s/foo/bar/; b2是一個回圈,重復輸出當前行,讀取下一行并執行替換s/foo/bar/。對于不包含模式的行,替換是一種無害的 no-op。
模式的第一個匹配是第二個回圈開始時的當前行,因此當第二個回圈第一次執行其n命令時,它的輸出不變。
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -z 's/foo/bar/2' file
吸食整個檔案到圖案空間和替換的第二次出現foo與bar。
選擇:
sed 'H;$!d;x;s/.//;s/foo/bar/2' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361171.html
