Text-Processing如何在空數據模式(
如何在空數據模式(-z
)中將行的開頭與 sed 匹配?
我了解到,使用 sed,可以通過使用空數據模式 (
-z
):來匹配模式的第 n 次出現sed -z 's/foo/bar/2'
。使用時如何匹配行首
-z
?如果我執行:
echo $'foo\nfoo\nfoo' | sed -z 's/^foo/baz/2'
沒有替換,因為
^
表示整個字元串的開頭:$ echo $'foo\nfoo\nfoo' | sed -z 's/^foo/baz/g' baz foo foo
在 Perl 中,有正
m
則表達式修飾符(當 slurping 時),但在 sed 中它沒有幫助。
echo $'foo\nfoo\nfoo' | sed -Ez 's/(^|\n)foo/\1baz/2'
^
需要正確計算foo
恰好在第一行的開頭。請注意,程式碼計算 的出現次數
(^|\n)foo
,而不是foo
。如果您想計算s,但僅在所需的出現恰好位於行首時才foo
替換,那麼此程式碼不是解決方案。例如在:echo $'foo foo\nfoo foo\nfoo foo' | sed -Ez 's/(^|\n)foo/\1baz/3'
被
foo
替換的不是第三個foo
。經 GNU
sed
4.8 測試。
在 Perl 中,有正
m
則表達式修飾符(當 slurping 時),但它沒有幫助。當然可以。
printf '%s\n' foo foo foo |\ perl -0777 -pe 's/^(foo)/++$c == 2 ? "bar" : $1/egm'
我們 slurp
-0777
,匹配很多次g
,並m
幫助它^
在 slurp 中匹配,然後僅在計數器變數為 2 時e
評估in。bar