unix sed - 如何用正则表达式替换多行

时间:2014-05-01 05:52:46

标签: regex bash unix sed

我有一些文件:

aaaaaaaaaa
# Lines Start #
bbbbbbbbb
cccccccc

dddddddddd
# Lines End #
eeeeeeeeee

一些变量$newLines="new line" 如何使用sed将变量值从# Lines Start #替换为# Lines End #(包括那些行本身)。

所以我会得到:

aaaaaaaaaa
new line
eeeeeeeeee

我尝试过使用:sed -E 'N; s/# Lines Start #\.*\# Lines End #/$newLines/' 但它没有做到这一点。

3 个答案:

答案 0 :(得分:2)

以下是sed的一种方式:

sed '/# Lines Start #/,/# Lines End #/{
/# Lines End #/!d
s/# Lines End #/new line/
}' file
aaaaaaaaaa
new line
eeeeeeeeee
  • 为您的模式创建正则表达式范围
  • 如果不是模式的结尾,请删除模式空间
  • 对于作为模式结尾的行,请使用new line
  • 替换

答案 1 :(得分:2)

如果您想尝试,可以使用awk

awk '/# Lines Start #/ {f=1} !f; /# Lines End #/ {print "new line";f=0}' file
aaaaaaaaaa
new line
eeeeeeeeee

您也可以使用sed中的范围,但其灵活性较差,因此我正常避免使用范围功能。

awk '/# Lines Start #/,/# Lines End #/ {if (!a++) print "new line";next}1' file
aaaaaaaaaa
new line
eeeeeeeeee

答案 2 :(得分:1)

这可能适合你(GNU sed):

var='first line\
second line\
third'
# N.B. multilines must end in "\" except for the last line
sed '/# Lines Start #/,/# Lines End #/c\'"$var" file