简体   繁体   中英

Find and replace text containing a new line

In bash, how can I find and replace some text containing a new line?

I want to match exactly 2 lines as specified (I can't match them separately as both lines appear at different places separately & I only want to replace where both lines appear consecutively). Using sed I was able to find and replace the individual lines and new line separately, but not together!

In case if needed, below are the lines I want to find and replace (from multiple files at once!):

} elseif ($this->aauth->is_member('Default')) { $form_data['userstat'] = $this->aauth->get_user()->id;

In general you can used sed -z which tells sed to use the null-character to split lines. Assume you have the file text containing

Hello World
This is a line
line1
line2
Hello World, again
line1
line2
end

Executing sed -z -e 's/line1\\nline2/xxx/g' text yields

Hello World
This is a line
xxx
Hello World, again
xxx
end

You can add * (that is <space><star> ) to handle inconstant white spaces.


In your specific case if you want to delete the second line you can use a block statement to advance to the next line and delete it if it matches the second line

sed -e '/line1/{n;/line2/d}' text

This might work for you (GNU sed):

sed -i 'N;s/first line\nsecond line/replacement/;P;D' file ...

Keep a moving window of two lines in the pattern space and replace when necessary.

NB -i option updates file(s) in place.

Also using a range and the change command:

sed -i '/first line/,/second line/c\replacement1\nreplacement2\netc' file ...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM