查找并替换包含新行的文本

时间:2017-10-09 21:18:23

标签: bash awk sed

在bash中,如何查找和替换包含新行的文本?

我想按照指定匹配2行(我不能单独匹配它们,因为两行分别出现在不同的地方而且我只想替换两行连续出现的地方)。使用sed我能够分别找到并替换单独的行和换行,但不能一起找到!

如果需要,以下是我想要查找和替换的行(一次从多个文件中获取!):

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

2 个答案:

答案 0 :(得分:1)

通常,您可以使用sed -z告诉sed使用空字符来分割线条。假设您有包含

的文件text
Hello World
This is a line
line1
line2
Hello World, again
line1
line2
end

执行sed -z -e 's/line1\nline2/xxx/g' text收益

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

您可以添加*(即<space><star>)来处理不定的空格。

在您的特定情况下,如果您想要删除第二行,您可以使用块语句前进到下一行,如果它与第二行匹配则将其删除

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

答案 1 :(得分:1)

这可能适合你(GNU sed):

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

在图案空间中保持两条线的移动窗口,并在必要时替换。

N.B。 -i选项可以更新文件。

还使用范围和更改命令:

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