Как заменить слово в несколько строк, используя sed? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь отредактировать файл CSV следующим образом:

1:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...
2:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...
3:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...
5:field1,field2,field3,FIELD I WANT TO REPLACE, fieldx ...

Могу ли я использовать sed для замены поиска шаблона FIELD I WANT TO REPLACE и переключения на что-то вроде:

1:field1,field2,field3,NEW FIELD, fieldx ...
2:field1,field2,field3,NEW FIELD, fieldx ...
3:field1,field2,field3,NEW FIELD, fieldx ...
5:field1,field2,field3,NEW FIELD, fieldx ...

Ответы [ 6 ]

0 голосов
/ 24 сентября 2018

Это может сработать для вас (GNU sed):

sed 's/[^,]*/NEW FIELD/4' file

Заменить 4-е вхождение нуля или более символов, не являющихся запятыми, на литерал NEW FIELD.

0 голосов
/ 24 сентября 2018

Вы могли бы рассмотреть правильный синтаксический анализатор CSV.Например, ruby ​​поставляется с одним:

ruby -rcsv -e '
  f = ARGV.shift
  # read the data
  data = CSV.read(f)
  # make your updates
  data.each {|row| row[6]="Service desk procedure2"}
  # write back to the file
  CSV.open(f, "w") {|csv| data.each {|row| csv << row}}
' file

или однострочником perl-ish (хотя я понимаю, что сообщество ruby ​​хмурится на такое)

ruby -rcsv -i.bak -ne 'CSV.parse($_) {|row| row[6]="foo"; puts CSV.generate_line(row)}' file
0 голосов
/ 24 сентября 2018

на основе комментария, который вы пытаетесь ввести

$ sed -i.bak 's/,Service desk procedure1,/,Service desk procedure2,/' file

запятые есть для исключения случайных совпадений, если искомая строка существует как подстрока где-то еще.Также не устанавливая флаг g, мы ограничиваем одно совпадение на строку.

Это сделает замену на месте, и старая версия будет переименована с суффиксом .bak.

0 голосов
/ 24 сентября 2018

Самое простое - использовать :

Допустим, вы хотите заменить поле 5

awk 'BEGIN{FS=OFS=","}{$5="SOME NEW TEXT"}1' file
0 голосов
/ 24 сентября 2018

Это работает, но я ожидаю более элегантных решений (вероятно, awk):

#!/bin/bash

echo "1:field1,field2,field3,FIELD I WANTawef TO REPfLACE, fieldx ..." > data.txt
echo "1:field1,field2,field3,FIELD I wefaaWANT TO REPLACE, fieldx ..." >> data.txt
echo "1:field1,field2,field3,FIELD I WANT TO REPawefL ACE, fieldx ..." >> data.txt
echo "1:field1,field2,field3,FIEawefLDa I WANT TO REPLACE, fieldx ..." >> data.txt

sed -e 's/\(.:.*,.*,.*\),.*,\(.*\)/\1,NEW FIELD,\2/' data.txt

Так что мои sed совпадения:

  • .: 1 символ, за которым следуют:
  • .*,.*,.*: 3 столбца
  • ,.*,: четвертый столбец.Я решил включить запятые в четвертый столбец, чтобы было понятнее читать
  • .*: все, что следует за 4-м столбцом
  • \1,NEW FIELD,\2: поместите все перед 4-м столбцом, новое поле и все, что следует за 4-м столбцом.

Таким образом, нет совпадения с любым контентом, таким образом, он всегда работает, пока выуважайте столбцы, разделенные ','.

0 голосов
/ 24 сентября 2018

Вы хотите просто найти и заменить?Если это так, попробуйте что-то вроде этого:

sed -e 's/FIELD I WANT TO REPLACE/NEW FIELD/' input_file >output_file

Если вы ищете что-то еще, пожалуйста, объясните подробнее.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...