【问题标题】:How do I sed only matched grep line我如何 sed 只匹配匹配的 grep 行
【发布时间】:2017-05-30 04:32:39
【问题描述】:

我只想在其他两个变量匹配时替换一个变量。例如,我的 data.txt 中有这个:

Mary Jane:Runs:Pasta
Mary Jane:Kicks:Apricot
John:Runs:Pasta

我只想在与这两个值匹配的行上替换一个变量。假设我希望第一个变量匹配“Mary Jane”,第二个变量匹配“Runs”,然后将该特定行从“Runs”更改为“Sleep”,结果应该是这样的:

Mary Jane:Sleeps:Pasta
Mary Jane:Kicks:Apricot
John:Runs:Pasta

但我得到了这个:

Mary Jane:Sleeps:Pasta
Mary Jane:Kicks:Apricot
John:Sleeps:Pasta

【问题讨论】:

  • 听起来你只是在要求sed 's/Mary Jane:Runs/Mary Jane:Sleeps/。但肯定不止这些,不是吗?
  • 是的,我认为您的回答会更相关,因为我正在考虑类似 sed "s/$VAR1:$VAR2/$VAR1:$NEW_VAR/" 的内容。谢谢!
  • 当需求更改为 first field is A and either 13th field is B or 27th field is C 之类的东西时,尝试在 sed 's/Mary Jane:Runs/Mary Jane:Sleeps/ 方法上构建会变得很丑陋,而在 awk 中它通常会是 $1=="A" && ($13=="B" || $27=="C") 并且如果您想添加 the third occurrence of... for例子然后忘记它。除了单行上的简单替换之外,您应该使用 awk 来获得清晰、简单、可移植、效率、可扩展性和大多数其他理想的软件属性。
  • 啊,谢谢 Ed 的解释。我现在对为什么使用 awk 有了更好的理解!

标签: shell unix sed grep sh


【解决方案1】:

为此,您应该真正使用 awk,而不是 sed:

awk 'BEGIN{FS=OFS=":"} ($1=="Mary Jane") && ($2=="Runs"){$2="Sleeps"} 1' file

【讨论】:

    【解决方案2】:

    这里有两个解决方案。一个使用sed,另一个使用awk。两者都使用了 shell 变量 whowhat(这有助于我们找到需要更改的行)。

    who="Mary Jane"                                  
    what="Runs"                                      
    
    sed "s/^$who:$what:/$who:Sleeps:/" data.in
    
    awk -vwho="$who" -vwhat="$what" -F':' \
      'BEGIN { OFS = FS } $1 == who && $2 == what { $2 = "Sleeps" } 1' data.in
    

    sed 示例使用双引号让 shell 扩展替换命令中的变量,而awk 示例通过将 shell 变量的值分配给 Awk 的方式将它们的值传输到 Awk 脚本中命令行中的变量。

    【讨论】:

      猜你喜欢
      • 2020-08-24
      • 2013-11-28
      • 2011-06-10
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 1970-01-01
      相关资源
      最近更新 更多