【问题标题】:search and replace a string in first occurrence搜索并替换第一次出现的字符串
【发布时间】:2014-07-08 10:39:18
【问题描述】:

我正在使用下面的sed 命令进行搜索和替换操作。

sed -i '/searchstring/s|find string|replace string|g' filename

它会更改输入文件中的所有匹配项。我怎样才能只做一次。

谢谢。

例如,

a

a

b

b

a

c

d

这是输入文件。

我使用的命令如下所示,

sed -i '/a/s|a|changed|g' filename

我得到的输出如下,

changed

changed

b

b

changed

c

d

也就是说,它改变了 3 次。

但我只需要更改一次。

预期的输出是,

changed

a

b

b

a

c

d

【问题讨论】:

    标签: linux sed terminal


    【解决方案1】:

    如果要替换整个文件中的第一个匹配项:

    awk '!f&&/search/{sub(/find/,"replace");f=7}7' file
    

    g

    awk '!f&&/search/{gsub(/find/,"replace");f=7}7' file
    

    是你需要的。

    【讨论】:

      【解决方案2】:

      使用 gnu sed,

      sed '0,/searchstring/ { /searchstring/ s|find string|replace string|g }' filename
      

      您需要调整任何 g 标志。

      【讨论】:

        【解决方案3】:

        这可能不是最优雅的解决方案,但很容易理解:

        tiago@dell:/tmp$ o="a";n="changed"; line=$(cat file | grep -n "$o" | cut -d: -f1| sort -n | head -1); sed -i.bak "$line s/$o/$n/g" file; cat file
        changed
        
        a
        
        b
        
        b
        
        a
        
        c
        
        d
        

        解释:

        找到第一次匹配的行号,然后在该行上运行替换。

        【讨论】:

          【解决方案4】:

          你可以使用这个sed

          sed -i '/searchstring/s|find string|replace string|'
          

          注意:删除g ( global substitution )

          根据您的更新,

          sed -i '/search/{ s/search/changed/; t loop;}; :loop; n; b loop' yourfile
          

          【讨论】:

          • 谢谢,需要的是我只想替换一次。但是给定的命令替换所有行中的字符串。
          • +1 也适用于 gnu sed,它可以做到 sed 's/foo/bar/n' nn-th 出现。
          • @user3304467 你应该在你的问题中指定only first occurrence 在整个文件中
          • @user3304467,更新了答案。
          【解决方案5】:

          删除g 是正确的方法,但只是为了展示它是如何使用awk 完成的

          awk '/searchstring/ {sub(/find string/,"replace string")}1' file
          

          【讨论】:

            猜你喜欢
            • 2011-08-25
            • 2016-11-02
            • 2011-06-05
            • 1970-01-01
            • 1970-01-01
            • 2022-10-07
            • 1970-01-01
            相关资源
            最近更新 更多