Text-Processing

如何在空數據模式(-z)中將行的開頭與 sed 匹配?

  • August 8, 2022

我了解到,使用 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 sed4.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

引用自:https://unix.stackexchange.com/questions/712934