如果我想替換多行,例如在檔案或 STDIN 中,但我不知道檔案或 STDIN 中出現的行數,我可以將整個流程變成一行,例如tr, 像這樣:
$ printf "%s\n" aaa bbb ccc ddd | tr '\n' '\0' | sed -e 's#bbb\x0ccc\x0ddd#string2\x0string3\x0string4#g' | tr '\0' '\n'
aaa
bbb
ccc
ddd
在這種情況下,我想得出這個結論:
aaa
string2
string3
string4
請注意,這是一個測驗示例,在實際情況下,我不知道進行替換的行數。我只知道需要替換的行和需要替換的行。
據我所知,sed可以替換NULL字符,例如:
printf "%s\n" aaa bbb ccc ddd | tr '\n' '\0' | sed -e 's#\x0#\n#g'
aaa
bbb
ccc
ddd
為什么在第一種情況下不會發生?
您可以嘗試用正則運算式替換它 -(.*)而不是\x0,但使用不同的輸入資料,它將使替換出錯,如下例所示:
$printf "%s\n" aaa bbb ccc ddd bbb ddd | tr '\n' '\0' | sed -e 's#bbb\(.*\)ccc\(.*\)ddd#string2\1string3\2string4#g' | tr '\0' '\n'
aaa
string2
string3
ddd
bbb
string4
你能告訴我如何正確替換多行嗎?謝謝您的幫助!
uj5u.com熱心網友回復:
問題似乎是\x轉義消耗的不僅僅是 1 個零。考慮在 中\x0c,0和c都是有效的十六進制數字。
十六進制轉義符的作業方式因語言而異。例如,在 C 中,它們非常貪婪(將盡可能使用所有有效的十六進制數字)。\x非寬字串的更明智的轉義將消耗恰好兩位數字(以填充 8 位位元組)。Sed 的版本似乎是這樣作業的。
實驗上,替換\x0為\x00作品:
printf "%s\n" aaa bbb ccc ddd | tr '\n' '\0' | sed -e 's#bbb\x00ccc\x00ddd#string2\x00string3\x00string4#g' | tr '\0' '\n'
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386446.html
