【问题标题】:Sed inline replace sentence in text file AFTER a match is found找到匹配项后,文本文件中的 Sed 内联替换句子
【发布时间】:2015-11-11 04:54:35
【问题描述】:

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

  • 我正在搜索第一个:'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 之后的所有文本,但随后管道进入 sed 而不是使用 -i 标志不再对文件执行任何更改。

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

【问题讨论】:

  • 显示示例输入以及该示例输入所需的输出。
  • @Cyrus 听起来很明显?
  • 添加了一个任意示例,尽管我确信从要点中不需要。

标签: regex bash sed


【解决方案1】:

用 GNU sed 试试这个:

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

【讨论】:

    【解决方案2】:

    您可以为此使用 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'
    

    【讨论】:

    • 嗯,为什么'local config'在那里?请注意:除了字符串 'database' => 'localhost'(或者这只是您的输出?)之外,没有预期的数据格式。
    • 它可能不存在。文件中唯一保证的数据将是:REPLACE_AFTER_THIS 和 'database' => 'localhost'。
    • 啊,这就是为什么我问“(或者这只是你的输出?)”,这更有意义,我会试一试:-)
    • 它不会更新文件。它按预期打印出更改,但文件需要使用更改进行更新。因此我使用 sed 的内联 -i。
    • 不幸的是,我有 GNU Awk 3.1.8。如果脚本无权访问目录,只有文件,并且我不想使用setfacl 获得对目录的额外权限以使其正常工作,则必须创建一个文件然后覆盖它并不是很好:-(
    猜你喜欢
    • 2016-11-23
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2022-01-20
    相关资源
    最近更新 更多