[英]Is sed auto in-place substitution?
我有此代碼,我想替換特定的模式,但不希望進行多次就地替換。
echo "ss qq" | sed "s/ss/qq/g; s/qq/dd/g;"
結果是
dd dd
並希望是
qq dd
同樣通過“循環”,我們得到相同的結果。
echo "ss qq" | sed ":loop; s/ss/qq/g; s/qq/dd/g; t loop;"
它的小巧,非常令人失望的錯誤!
有什么建議為什么會發生嗎?
至於“為什么發生”:sed逐行輸入輸入,然后依次應用每個命令。 如果查看命令的GNU sed(4.6或更高版本)的調試輸出,這將變得更加清楚:
$ sed --debug 's/ss/qq/g;s/qq/dd/g' <<< 'ss qq'
SED PROGRAM:
s/ss/qq/g
s/qq/dd/g
INPUT: 'STDIN' line 1
PATTERN: ss qq # Pattern space before first command is applied
COMMAND: s/ss/qq/g
MATCHED REGEX REGISTERS
regex[0] = 0-2 'ss'
PATTERN: qq qq # Pattern space before second command is applied
COMMAND: s/qq/dd/g
MATCHED REGEX REGISTERS
regex[0] = 0-2 'qq'
PATTERN: dd dd
END-OF-CYCLE:
dd dd
希望如此
qq dd
然后您以相反的順序進行替換:
更改sed "s/ss/qq/g;s/qq/dd/g;"
-> sed "s/qq/dd/g;s/ss/qq/g;"
也許是您要查找的y///
命令的行為:
▶ echo "ss qq" | sed 'y/sq/qd/'
qq dd
這將一個字符一個字符地將所有s
轉換為q
,將所有q
轉換為d
。
這可能對您有用(GNU sed):
sed 's/ss\|qq/\n&/;:a;s/\nss/qq\n/;s/\nqq/dd\n/;s/\n\(.\)/\1\n/;ta;s/\n//' file
這將以換行符的形式引入有關最后替換發生位置的標記。 在該行的末尾,標記被刪除。
使用該標記的原因是因為每次替換命令的調用均從該行的開頭重新開始,而不是從最后一次替換結束的地方開始。 g
標志可能會使問題感到困惑,但僅屬於替換的當前調用。
如前所述,更好的方法是對第一個替換使用替代方法,並將其全局替換為最后一個命令。
sed 's/ss/\n/g;s/qq/dd/g;s/\n/qq/g' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.