在shell脚本中搜索多行,包括空行

时间:2012-03-16 10:47:20

标签: shell sed pattern-matching

我使用以下命令查找跨越多行的模式并将其替换为空行:

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,但是,它返回一个即使文件包含这些模式,也会输出空白。有线索吗?

2 个答案:

答案 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.