#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;
и т.д.