在不同行开始和结束的模式之间进行替换

在不同行开始和结束的模式之间进行替换

我有一个具有以下格式的文件:

Whatever1
Whatever2
Whatever3
binaries=(
text1
bin2
ohhh3
)
Whatever4
Whatever5
Whatever6

我需要用命令输出binaries=(替换任何内部行。)

我可以使用如下命令选择以下块sed -n -e '/binaries=(/,/)/p' filename

binaries=(
text1
bin2
ohhh3
)

或者用这个更好awk '/binaries/,/)/{if(!/binaries|)/)print}' filename

text1
bin2
ohhh3

但是,我必须重写原始文件,而且我不知道如何继续。

答案1

使用 GNU sed

sed '/binaries=(/,/)/{
       //!d
       /)/e uname
     }'

替换uname为您的命令。

答案2

我会用 awk 来做,例如:

awk '
  f && /)/ { f=0 }
  !f
  !f && /binaries=\(/ { f=1 ; p=1 }
  p { system ("your_command") ; p=0 }
'

其中“your_command”将定义替换。

说明:该标志f将控制状态机;如果已设置,则您位于应被替换的块中。随着开始和结束模式的匹配,标志会相应地改变。当你在块中时,系统调用将被执行;该标志p仅用于打印一次。

要替换原始文件,请创建一个新文件,然后覆盖原始文件,或者使用awk带有选项的最新版本的 GNU -i inplace

相关内容