【问题标题】:sed command to replace first occurrence in file is not working替换文件中第一次出现的 sed 命令不起作用
【发布时间】:2020-12-09 19:15:41
【问题描述】:

我正在尝试替换文件中出现的第一个字符串。例如尝试用 linux

替换第一个 foo

示例.txt

Hi foo bar
This is again foo bar.

命令:sed '0,/foo/s//linux/' sample.txt

上述命令的实际输出(基本没有变化)

Hi foo bar
This is again foo bar.

我的预期输出如下

Hi linux bar
This is again foo bar.

有人可以帮忙吗?

【问题讨论】:

  • 您缺少 -i 标志,它替换了文件的内容
  • 什么不起作用?替换?还是就地编辑?
  • 现在不管是替换文件中的内联还是显示。我的首要任务是让它发挥作用。
  • 如果您查看stackoverflow.com/q/148451/5291015,您会发现您的尝试仅适用于 GNU sed,而不适用于 MacOS 提供的本机版本

标签: regex awk sed


【解决方案1】:

/tmp/test.txt

Hi foo bar!
This is again foo bar

使用以下 commando 仅替换搜索字符串的first orrouance;

sed -e '1 s/foo/linux/; t' -e '1,// s//linux/' /tmp/test.txt

结果

Hi linux bar!
This is again foo bar

【讨论】:

  • @Sundeep 如果第一个 foo 不在第一行,这也会起作用
  • 对不起,之前误解了命令,这是一个很好的解决方法!
【解决方案2】:

以下任何awk 可能会有所帮助:

awk '/foo/ && ++count==1{sub(/foo/,"linux")} 1' Input_file

对于 GNU sed,如果框内有足够的内存可能会有所帮助:

sed -z 's/foo/linux/' Input_file

【讨论】:

    【解决方案3】:

    awk

    awk '!f && sub(/foo/, "linux"){f=1} 1' ip.txt
    
    • !f 将为 true,因为未初始化的变量默认为 false
    • sub(/foo/, "linux") 将替换第一次出现的 foo 并返回 1 - 从而使 f=1 和随后的 !f 始终为 false
    • 1 打印 $0

    【讨论】:

      猜你喜欢
      • 2021-12-29
      • 2020-12-07
      • 2018-05-24
      • 2016-04-02
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多