我正在尝试在找到匹配项后替换文本文件中的第一个句子实例。请注意,'
引号包含在搜索中。
'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>
标志进行管道传输不再对文件执行任何更改。
如何在文件中找到给定字符串后,更改当前正在运行的解决方案以包含替换句子的第一个实例?
答案 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'