заменить последнее слово в определенной строке sed

#bash #awk #replace #word

#bash #awk #заменить #cpu-word

Вопрос:

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

 abc dog      1.0
abc cat      2.4
abc elephant 1.2
  

и я хочу заменить последнее слово из строки, содержащей ‘elephant’, на строку, которую я знаю.
Результат должен быть

 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
  

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

Комментарии:

1. sed 's/(elephant)(.*$)/1 mystring/' input

2. Добро пожаловать в SO, как также упоминалось в комментариях, постоянно меняющиеся требования НЕ должны возникать ни по одному вопросу. Также всегда добавляйте 3 вещи в свой пост, 1- образец ввода, 2- образец ожидаемого результата и 3 — усилия, которые вы приложили для решения вашей проблемы в ТЕГАХ кода в вашем посте, приятного обучения.

Ответ №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 amp;amp; mv temp_file Input_file
  

Комментарии:

1. это хорошо, но если у меня несколько пробелов, awk удаляет его. как запретить awk делать это?

2. @czaduu, если у вас все в порядке с табуляцией через пробелы, вы могли бы попробовать мое второе решение.

3. @czaduu, с вашим приведенным примером у меня все в порядке, не могли бы вы, пожалуйста, опубликовать образец в своем сообщении и затем сообщить мне? (с одним нечетным пробелом)

4. это здорово! Спасибо! еще один вопрос — я добавил edit2.

5. @czaduu, это совсем другой вопрос, не рекомендуется постоянно изменять ваш вопрос, пожалуйста, откройте для него новый вопрос. Удалите это и из этого вопроса, спасибо.

Ответ №2:

Базовые модели

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

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

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

Ответ №3:

альтернативный способ выполнить замену и сохранить пробел:

 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
  

Ответ №4:

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

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

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