sed – использовать файл1 для поиска замен, содержащихся в файле2 для строк из файла3

Я новичок здесь и не много писал, я постараюсь сделать это как можно яснее.

Я хочу выполнить поиск и замену, который включает в себя три файла: find.csv идентифицирует строки, содержащие строки. Я хочу заменить всю строку на строку из replace.csv. Третий файл – файл mainfile.csv, который содержит около 1000 строк.

Это то, что у меня есть до сих пор, но я получаю сообщение об ошибке:

sed "s/$(cat find.csv)/$(cat replace.csv)/" mainfile.csv > out.csv sed: 1: "s/CHL_13_R4 DCK_09_R4 ...": unterminated substitute pattern 

Вот как выглядит содержимое файлов:

 find.csv CHL_13_R4 DCK_09_R4 DCK_10_R4 DCK_11_R4 DCK_13_R4 replace.csv CHL_13_R12,CHL_13,R12,10/14/2014 DCK_09_R12,DCK_09,R12,10/14/2014 DCK_10_R32,DCK_10,R32,10/14/2014 DCK_11_R21,DCK_11,R21,10/14/2014 

Основной файл содержит записи как в replace.csv, но около 30 необходимо обновить. Итак, возьмем первую строку в качестве примера. Строку в файле mainfile.csv, которая имеет «CHL_13_R4», должна быть заменена на CHL_13_R12, CHL_13, R12,10 / 14/2014

Спасибо за помощь!

One Solution collect form web for “sed – использовать файл1 для поиска замен, содержащихся в файле2 для строк из файла3”

Сначала создайте сценарий sed из этих двух файлов:

 paste -d$'\t' find.csv replace.csv | sed -e 's:/:\\/:g; s:\t:/:; s:^:s/:; s:$:/g;:' > myscript.sed 

Это заменит все вхождения строк в find.csv со строками в replace.csv . Он будет терпеть неудачу, если какая-либо из строк в find.csv содержит символ табуляции, поскольку это используется paste в качестве разделителя между соединенными строками.

Результат выглядит следующим образом:

 s/CHL_13_R4/CHL_13_R12,CHL_13,R12,10\/14\/2014/g; s/DCK_09_R4/DCK_09_R12,DCK_09,R12,10\/14\/2014/g; s/DCK_10_R4/DCK_10_R32,DCK_10,R32,10\/14\/2014/g; s/DCK_11_R4/DCK_11_R21,DCK_11,R21,10\/14\/2014/g; s/DCK_13_R4//g; 

(обратите внимание, что последняя строка не имеет замены. Это потому, что ваш find.csv имел 5 строк, а ваш replace.csv имел только 4 строки)

Если вы хотите заменить всю строку, содержащую строки, на find.csv :

 paste -d$'\t' find.csv replace.csv | awk -F$'\t' '{gsub(/\//,"\\/"); print "/"$1"/ s/^.*/"$2"/;"}' > myscript.sed 

Вывод этой версии выглядит следующим образом:

 /CHL_13_R4/ s/^.*/CHL_13_R12,CHL_13,R12,10\/14\/2014/; /DCK_09_R4/ s/^.*/DCK_09_R12,DCK_09,R12,10\/14\/2014/; /DCK_10_R4/ s/^.*/DCK_10_R32,DCK_10,R32,10\/14\/2014/; /DCK_11_R4/ s/^.*/DCK_11_R21,DCK_11,R21,10\/14\/2014/; /DCK_13_R4/ s/^.*//; 

В любом случае, какая версия лучше всего подходит для вас, как только вы сгенерировали скрипт myscript.sed , запустите его на своем mainfile.csv :

 sed -f myscript.sed mainfile.csv 

(необязательно используйте -i если вы хотите сделать «на месте» редактирование на mainfile.csv )

ПРИМЕЧАНИЕ. Это можно сделать без использования временного файла, такого как myscript.sed для хранения сценария. Большинство версий sed могут запускать скрипты из stdin. Но этот способ позволяет вам изучить и / или отредактировать созданный скрипт sed перед его запуском в вашем основном файле.

  • sed: захват и замена всех данных между последней обратной косой чертой и запятой
  • sed one-liner для удаления словесных пространств
  • извлекать часть строки, используя sed
  • Подсчет запятыми разделенных символов подряд
  • Чтение заданных строк в файле - BASH
  • Улучшить команду sed для замены первого экземпляра символа и всех следующих символов?
  • обновить переменную PATH в .bashrc, используя sed
  • Извлеките строки из файла containg From <str1> To <str2>
  • Можно ли использовать sed для генерации файла нагрузки для таблицы фактов поиска даты?
  • sed backreference: получить каждую строку и добавить ее к концу строки
  • замените блок текста содержимым файла
  • Заменить только первый символ совпадающего шаблона
  • Linux и Unix - лучшая ОС в мире.