我使用以下命令查找跨越多行的模式并将其替换为空行:
sed -n '1h; 1!H; ${ g; s/<Pattern1>\n<pattern2> //g p }' <file-name>
例如,找到模式 约翰 DOE
在文件test.txt中,其中包含以下条目:
Mary
John
Doe
Simon
Henry
我会使用命令:
sed -n '1h; 1!H; ${ g; s/John\nDoe //g p }' test.txt
但是,我似乎无法使这个命令适用于第二行作为空白的模式,即使用^ $字符。
因此,如果我要搜索多行模式,Mary后面跟一个空行,我看不到任何匹配的模式。因此,以下命令不会导致搜索,也不会导致替换。
sed -n '1h; 1!H; ${ g; s/Mary\n^$ //g p }' test.txt
有什么想法吗?
修改
但是,如果我在文件中存储多个这样的命令并执行它们,那么第一次搜索就会很好,但是在搜索后续模式时,我从sed得到一个空白输出。
那就是我存储,sed -n'1h; !1小时; $ {g; s / \ n // g p}'sed -n'1h; !1小时; $ {g; s / \ n // gp}'在一个文件中,然后使用eval关键字执行此文件中的每一行,然后第一个sed替换第一个多行模式,即pattern1,然后是pattern2,但是,它返回一个即使文件包含这些模式,也会输出空白。有线索吗?
答案 0 :(得分:2)
这可能对您有用:
sed '$!N;s/John\nDoe//;P;D' file
Mary
Simon
Henry
sed '$!N;s/Mary\n$//;P;D' file
John
Doe
Simon
Henry
N.B。 ^
指的是字符串的开头不是行的开头(除非在GNU中你使用m
标志)。同样地,$
表示字符串的结尾。
编辑:
可以组合上述两个命令:
sed '$!N;s/John\nDoe//;s/Mary\n$//;P;D' file
Simon
Henry
答案 1 :(得分:1)
这适用于我的输入文件:
sed -n '1h; 1!H; ${ g; s/Mary\n\n/\n/g p }'
说明:
Mary\n\n # Mary with two consecutive newlines, the first one is automatically added by
# the 'H' command, and the next one means the empty line, asumming it has no
# spaces.
\n # Substitute it with a blank line.