【发布时间】:2012-04-01 21:55:19
【问题描述】:
我正在使用以下命令来查找跨越多行的模式并将其替换为空行:
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
但是,我似乎无法使此命令适用于第二行为空白的模式,即使用 ^$ 字符。
因此,如果我要搜索多行模式,Mary 后跟一个空行,我看不到任何匹配的模式。因此,以下命令不会导致搜索,因此不会进行替换。
sed -n '1h; 1!H; ${ g; s/Mary\n^$ //g p }' test.txt
有什么想法吗?
编辑
但是,如果我将多个这样的命令存储在一个文件中并执行它们,那么第一次搜索可以正常进行,但是在搜索后续模式时,我会从 sed 得到一个空白输出。
如果我存储,sed -n '1h; 1!H; ${克; s/\n //g p }' sed -n '1h; 1!H; ${克; s/\n //gp }' 在一个文件中然后使用eval关键字执行这个文件中的每一行,然后第一个sed替换第一个多行模式,即pattern1,然后是pattern2,但是,它返回一个即使文件包含这些模式,也会出现空白输出。有什么线索吗?
【问题讨论】:
标签: shell sed pattern-matching