Searching for multiple lines including a blank one in shell script

为君一笑 提交于 2019-12-12 02:48:04

问题


I am using the following command to find a pattern spanning multiple lines and replacing it with a blank line:

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

For example, to find the pattern John Doe

in a file test.txt which contains the following entries:

Mary

John
Doe
Simon
Henry

I would use the command:

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

However, I can't seem to make this command work for a pattern which has the second line as a blank, i.e. using the ^$ character.

Thus, if I were to search for the multi-line pattern, Mary followed by a blank line, I do not see any matching patterns. Thus, the following command causes no searches and thus no substitutions.

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

Any thoughts?

EDIT


However, if I store multiple such command in a file and execute them, then the first search goes through fine, however on searching for subsequent patterns, I get a blank output from sed.

That is if I store, sed -n '1h; 1!H; ${ g; s/\n //g p }' sed -n '1h; 1!H; ${ g; s/\n //g p }' in a file and then execute each line in the this file using the eval keyword, then the first sed replaces the first multi-line patterns, i.e. pattern1, followed by pattern2, however, it returns a blank output even though the file contains these patterns. Any clues?


回答1:


This works for me with your input file:

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

Explanation:

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.



回答2:


This might work for you:

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. ^ refers to the start of the string not the beginning of a line (unless in GNU sed you use the m flag). Likewise $ means the end of the string.

EDIT:

The above two commands can be combined:

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


Simon
Henry


来源:https://stackoverflow.com/questions/9735865/searching-for-multiple-lines-including-a-blank-one-in-shell-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!