在找到匹配项后,sed内联替换文本文件中的句子

时间:2015-08-18 10:00:33

标签: regex bash sed

我正在尝试在找到匹配项后替换文本文件中的第一个句子实例。请注意,'引号包含在搜索中。

  • 我正在搜索 'database' => 'localhost'
  • 第一个
  • 我将第一个实例替换为:'database' => 'new_database'
  • 我想在字符串'REPLACE_AFTER_THIS'
  • 之后替换

我目前有前两个要点:

sed -i file -e "1s/'database' => 'localhost'/'database' => 'new_database'/;t" -e "1,/'database' => 'localhost'/s//'database' => 'new_database'/" file

输入文件

'local config' ... 'data'
    'more data'
    'database' => 'localhost'
    'even more data'
'REPLACE_AFTER_THIS' ... 'data'
    'more data'
    'even more data'
    'database' => 'localhost'
'live config'
    'database' => 'localhost'

预期的输出文件 (同一文件内联更改)

'local config' ... 'data'
    'more data'
    'database' => 'localhost'
    'even more data'
'REPLACE_AFTER_THIS' ... 'data'
    'more data'
    'even more data'
    'database' => 'new_database'
'live config'
    'database' => 'localhost'

上面的示例演示了字符串'database' => 'localhost'除了之外没有预期的数据格式,第一次出现需要在'REPLACE_AFTER_THIS'之后更改。

但是,在找到某个字符串后,我无法弄清楚如何只执行上面的。我已经尝试使用grep和模式​​来检索REPLACE_AFTER_THIS之后的所有文本,但是然后使用-i标志而不是使用<div ng-app="" ng-init="names=[ { 'userId': '15', 'mgId': '1', 'mgName': 'Oracle' }, { 'userId': '16', 'mgId': '2', 'mgName': 'SunCorp' } ]"> <p>Looping with objects:</p> <div ng-repeat="x in names"> <input ng-model="x.userId"></input></div> </div> 标志进行管道传输不再对文件执行任何更改。

如何在文件中找到给定字符串后,更改当前正在运行的解决方案以包含替换句子的第一个实例?

2 个答案:

答案 0 :(得分:2)

尝试使用GNU sed:

sed -i "/'REPLACE_AFTER_THIS'/,/'database' => 'localhost'/s/'database' => 'localhost'/'database' => 'new_database'/" file

答案 1 :(得分:1)

您可以使用awk:

temp=$(mktemp /tmp/temporary-file.XXXXXXXX)
awk "/REPLACE_AFTER_THIS/{u=1} u && 
 sub(/'database' => 'localhost'/, \"'database' => 'new_database'\") {u=0} 1" file > "$temp"

<强>输出:

'local config' ... 'data'
    'more data'
    'database' => 'localhost'
    'even more data'
'REPLACE_AFTER_THIS' ... 'data'
    'more data'
    'even more data'
    'database' => 'new_database'
'live config'
    'database' => 'localhost'