2

我有文件

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

现在尝试更改最后一行。

4

4 回答 4

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)。

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
于 2019-03-05T12:14:59.967 回答
1

基本的

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

如果最后有一些空间

sed '/elephant/ s/[^[:blank:]]\{1,\}[[:blank:]*$/mystring/' $file
于 2019-03-05T15:51:04.620 回答
0

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

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
于 2019-03-05T13:47:56.673 回答
0

在任何 awk 中稳健地运行:

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

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

于 2019-03-05T15:20:32.667 回答