заменить последнее слово в конкретной строке sed - PullRequest
1 голос
/ 05 марта 2019

У меня есть файл как

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 но что должно быть вместо "%"?

EDIT: странный пример

abc dogdogdogdog      1.0
abc cat               2.4
abc elephant          1.2

и теперь попробуйте изменить последнюю строку.

Ответы [ 4 ]

0 голосов
/ 05 марта 2019

основной

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

если в конце может быть пробел

sed '/elephant/ s/[^[:blank:]]\{1,\}[[:blank:]*$/mystring/' $file
0 голосов
/ 05 марта 2019

альтернатива для замены и сохранения места:

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
0 голосов
/ 05 марта 2019

Надежно в любом awk:

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

Обратите внимание, что в отличие от других ваших ответов, он не потерпит неудачу, когда целевая строка (elephant) является частью какой-либо другой строки или появляется в некоторыхиное расположение, чем 2-е поле, или содержит метасхемы регулярных выражений, или когда строка замены содержит & и т. д.

0 голосов
/ 05 марта 2019

РЕДАКТИРОВАТЬ: Чтобы сохранить пробелы, пожалуйста, попробуйте следующее.

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
...