用Shell替换Shell中的多行文件

时间:2014-10-10 23:06:04

标签: regex bash shell sed scripting

我有一个txt文件:

A
B
<anything>
C
D

我想用字符串替换文件中的B到C,但这不匹配:

sed -i -e "s/B.*C/replace/g" $fileName

我找到了如何使用以下方法定位多行字符串:

awk '/B/,/C/' $fileName

2 个答案:

答案 0 :(得分:2)

$ awk '/B/{print "Replacement Text"} /B/,/C/{next} 1' "$fileName" 
A
Replacement Text
D

awk代码的说明:

  • /B/{print "Replacement Text"}

    当我们看到B行时,请打印出新文本,无论它是什么。

  • /B/,/C/{next}

    BC之间的任何行,请跳过其余命令并跳转到下一行。

  • 1

    这是打印当前行的awk简写。

可变文本

如果替换文本位于shell变量newtext中,请使用:

awk -v new="$newtext" '/B/{print new} /B/,/C/{next} 1'

要修改文件

如果你有GNU awk v4.1.0或更高版本:

$ awk -i inplace '/B/{print "Replacement Text"} /B/,/C/{next} 1' "$fileName" 

使用早期版本:

awk '/B/{print "Replacement Text"} /B/,/C/{next} 1' "$filename" >tmp && mv tmp "$filename"

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed '/B/,/C/c\replacement' file

或:

var=replacement; sed '/B/,/C/c\'$var file