在shell脚本中搜索包括空白行在内的多行



我正在使用以下命令来找到一个跨越多行的模式,并将其替换为空行:

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/JohnnDoe //g p }' test.txt

然而,我似乎无法使此命令适用于第二行为空白的模式,即使用^$字符。

因此,如果我要搜索多行模式,玛丽后面跟着一行空白,我看不到任何匹配的模式。因此,以下命令不会导致搜索,因此不会导致替换。

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

有什么想法吗?

编辑


然而,如果我在一个文件中存储多个这样的命令并执行它们,那么第一次搜索会很顺利,但在搜索后续模式时,我会从sed得到一个空白输出。

也就是说,如果我存储,sed-n'1h;1.H${g;s/\n//g p}'sed-n’1h;1.H${g;s/\n//g p}',然后使用eval关键字执行该文件中的每一行,然后第一个sed替换第一个多行模式,即pattern1,然后是pattern2,然而,即使文件包含这些模式,它也会返回空白输出。有线索吗?

这可能对您有用:

sed '$!N;s/JohnnDoe//;P;D' file
Mary

Simon
Henry
sed '$!N;s/Maryn$//;P;D' file
John
Doe
Simon
Henry

注意:^指的是字符串的开头,而不是一行的开头(除非在GNU sed中使用m标志)。同样地,$表示字符串的末尾。

编辑:

以上两个命令可以组合:

sed '$!N;s/JohnnDoe//;s/Maryn$//;P;D' file

Simon
Henry

这适用于我的输入文件:

sed -n  '1h; 1!H; ${ g; s/Marynn/n/g p }'

说明:

Marynn                # 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.

相关内容

最新更新