Bash 替换特定行中的最后一个单词

Bash 替换特定行中的最后一个单词,bash,awk,replace,word,Bash,Awk,Replace,Word,我有文件 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但是应该用什么来代替''%1!' 编辑: 奇怪的例子 abc dogdogdogdog 1.0 abc cat

我有文件

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
但是应该用什么来代替''%1!'

编辑: 奇怪的例子

abc dogdogdogdog      1.0
abc cat               2.4
abc elephant          1.2
现在尝试更改最后一行。

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

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


请您尝试以下内容(如果您对
awk
)满意的话)

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

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

替换和保留空间的替代方案:

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
在任何awk中都非常可靠:

$ awk '$2=="elephant"{sub(/[^[:space:]]+$/,""); $0=$0 "mystring"} 1' file
abc dog      1.0
abc cat      2.4
abc elephant mystring
请注意,与目前为止的其他答案不同,当目标字符串(
elephant
)是其他字符串的一部分,或者出现在第二个字段以外的其他位置,或者包含任何regexp元字符,或者当替换字符串包含
等时,它不会失败。

basic

sed '/elephant/ s/[^[:blank:]]\{1,\}$/mstring/' $file
如果最后能留点空间的话

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

sed的/\(大象\)(.*$\)/\1 mystring/”输入
欢迎使用SO,如评论中所述,任何问题都不应不断更改需求。另外,在你的帖子中总是添加3件东西,1-输入样本,2-预期输出样本和3-你为解决问题在你的帖子中的代码标签中付出的努力,快乐学习。这很好,但如果我有多个空格,awk会删除它。如何防止awk这样做?@czaduu,如果您对空格中的制表符没有问题,那么您可以尝试我的第二种解决方案。@czaduu,您给出的示例对我来说很好,您能在您的帖子中发布示例并让我知道吗?(使用奇数空格一)这很好!谢谢还有一个问题-我添加了edit2。@czaduu,这是一个不同的问题,不建议继续更改您的问题,请为其打开一个新问题。请把这个问题也去掉,谢谢。