搜索多条线路包括空一个在shell脚本(Searching for multiple lines i

2019-10-29 06:52发布

我使用下面的命令来寻找模式跨越多行,并用一个空行替换它:

sed -n '1h; 1!H; ${ g; s/<Pattern1>\n<pattern2> //g p }' <file-name>

例如,要查找模式李四

其中包含以下条目的文件test.txt:

Mary

John
Doe
Simon
Henry

我会用下面的命令:

sed -n  '1h; 1!H; ${ g; s/John\nDoe //g p }' test.txt

不过,我似乎无法使这个命令工作具有使用^ $字符第二线为空白,即模式。

因此,如果我要搜索多行的模式,玛丽之后是一个空行,我看不出有任何匹配模式。 因此,下面的命令导致没有搜索,因此没有取代。

sed -n  '1h; 1!H; ${ g; s/Mary\n^$ //g p }' test.txt

有什么想法吗?

编辑


但是,如果我在一个文件中存储多个这样的命令并执行,那么第一个搜索经过精细,但是在寻找后续的模式,得到了一个空白输出sed的。

也就是说,如果我存储,sed的-n“1小时; !1小时; $ {克; S / \ n // GP} '的sed -N' 1H; !1小时; $ {克; S / \ n //在一个文件中,然后使用eval关键字执行这个文件中的每一行GP}”,则第一SED取代第一多线图案,即模式1,其次是PATTERN2,然而,它返回一个即使该文件包含这些模式的空白输出。 任何线索?

Answer 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.


Answer 2:

这可能会为你工作:

sed '$!N;s/John\nDoe//;P;D' file
Mary


Simon
Henry
sed '$!N;s/Mary\n$//;P;D' file

John
Doe
Simon
Henry

NB ^指字符串不是行的开头(除非在GNU sed中使用的起始m标志)。 同样$表示字符串的结束。

编辑:

上述两个命令可以被组合:

sed '$!N;s/John\nDoe//;s/Mary\n$//;P;D' file


Simon
Henry


文章来源: Searching for multiple lines including a blank one in shell script