【问题标题】:replace last word in specific line sed替换特定行中的最后一个单词 sed
【发布时间】:2019-07-26 21:39:33
【问题描述】:

我有类似的文件

abc dog      1.0
abc cat      2.4
abc elephant 1.2

我想用我知道的字符串替换包含“大象”的行中的最后一个单词。 结果应该是

abc dog      1.0
abc cat      2.4
abc elephant mystring

我有 sed '/.*elephant.*/s/%/%/' $file,但应该用什么来代替 '%'?

编辑: 奇怪的例子

abc dogdogdogdog      1.0
abc cat               2.4
abc elephant          1.2

现在尝试更改最后一行。

【问题讨论】:

  • sed 's/\(elephant\)\(.*$\)/\1 mystring/' input
  • 欢迎来到 SO,正如 cmets 中所提到的,任何问题都不应该发生不断变化的需求。还要始终在您的帖子中添加 3 件事,1- 输入样本,2- 预期输出样本和 3- 您为解决帖子中代码标签中的问题所做的努力,学习愉快。

标签: bash awk replace word


【解决方案1】:

编辑:要保留空格,请尝试以下操作。

awk '
match($0,/elephant[^0-9]*/){
  val=substr($0,RSTART,RLENGTH-1)
  sub("elephant","",val)
  $NF=val "my_string"
  val=""
}
1
'  Input_file


你能试试关注吗(如果你对awk没问题)。

awk '/elephant/{$NF="my_string"} 1' Input_file

如果您想将输出保存到 Input_file 本身,请尝试以下操作。

awk '/elephant/{$NF="my_string"} 1' Input_file > temp_file && mv temp_file Input_file

【讨论】:

  • 很好,但是如果我有多个空格,awk 会删除它。如何防止 awk 这样做?
  • @czaduu,如果您对空格中的 TAB 没问题,那么您可以尝试我的第二个解决方案。
  • @czaduu,你给出的例子对我来说很好,你能在你的帖子中发布样本然后让我知道吗?(有一个奇数空格)
  • 太好了!谢谢!还有一个问题 - 我添加了 edit2。
  • @czaduu,这都是一个不同的问题,不建议不断更改您的问题,请为它打开一个新问题。也从这个问题中删除它,谢谢。
【解决方案2】:

进行替换并保留空间的替代方法:

awk '/elephant/{sub(".{"length($NF)"}$","new")}7' file

用你的例子:

kent$ cat f
abc dog         1.0
abc cat         2.4
abc elephant    1.2

kent$ awk '/elephant/{sub(".{"length($NF)"}$","new")}7' f
abc dog         1.0
abc cat         2.4
abc elephant    new

【讨论】:

    【解决方案3】:

    在任何 awk 中都很稳健:

    $ awk '$2=="elephant"{sub(/[^[:space:]]+$/,""); $0=$0 "mystring"} 1' file
    abc dog      1.0
    abc cat      2.4
    abc elephant mystring
    

    请注意,与您到目前为止的其他答案不同,当目标字符串 (elephant) 是其他字符串的一部分或出现在第二个字段以外的其他位置或包含任何正则表达式元字符时,它不会失败,或者当替换字符串包含&等。

    【讨论】:

      【解决方案4】:

      基本

      sed '/elephant/ s/[^[:blank:]]\{1,\}$/mstring/' $file
      

      如果结尾有空格

      sed '/elephant/ s/[^[:blank:]]\{1,\}[[:blank:]*$/mystring/' $file
      

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2013-09-12
        • 2010-12-15
        • 2012-04-23
        • 2020-06-30
        • 2011-08-12
        • 1970-01-01
        相关资源
        最近更新 更多