Как заменить строки-заполнители в документе содержимым из файла

У меня есть два файла: A и B

Файл A – это буква, как <@userid> ниже, которая содержит несколько строк-заполнителей в каждой строке, например <@userid> .

 <@U39RFF91U> for all the help in this project! Thanks for your help to enhance the data quality <@U2UNRTLBV> <@U39RFF91U> <@U2UQCN023>! Thanks for <@U38F4TBQ9> <@U38F5PQ73> <@U38F747CZ> <@U39RT0G07> and <@U2UQ17U20> 's great work at the New Product! Successful release! <@U2WHAAU9H> <@U2ML3C551> <@U38F4TBQ9> <@U38F747CZ> <@U39RT0G07> <@U2UQ17U20> <@U38F5PQ73> <@U2N64H7C6>! Praise <@U2X0APW3Y> for going above and beyond to help with the retail campaign! 

Файл B представляет собой таблицу сопоставления, отображающую все идентификаторы пользователей для каждого имени пользователя:

 U39RFF91U Person1 U2UNRTLBV Person2 

Я хотел бы разработать окончательный файл C с содержимым из буквы в A , но со всеми заполнителями заменить соответствующий контент из таблицы сопоставления в файле B

Любая идея, как это сделать с помощью сценария оболочки в Linux?

5 Solutions collect form web for “Как заменить строки-заполнители в документе содержимым из файла”

Вы можете преобразовать сопоставления в сценарий редактирования sed следующим образом:

 $ sed -r 's#^([^[:blank:]]*)[[:blank:]]+(.*)#s/<@\1>/\2/g#' user_map.txt >script.sed 

С учетом примера, это приведет к созданию script.sed с содержимым

 s/<@U39RFF91U>/Person1/g s/<@U2UNRTLBV>/Person2/g 

Затем вы можете применить этот скрипт редактирования к текстовому файлу:

 $ sed -f script.sed letter.txt >completed_letter.txt 

Может быть сделано либо с sed, либо даже с использованием только инструментов bash.

Классическое решение bash:

 var="$(cat file.txt)";while read -r id name;do var="${var//@$id/$name}";done<mapfile.txt;echo "$var" 

Вы можете добавить >newfile.txt к последней команде, чтобы отправить окончательный текст в новый файл.

Решение Sed с внесением изменений в один и тот же файл:

 while read -r id name;do sed -i "s/\@$id/$name/g" textfile.txt;done<mapfile.txt 

Это решение может работать медленнее, если файл mapfile / text довольно велик, поскольку внешний app sed вызывается для каждой записи, найденной в файле карты.

Оба решения работают нормально с вашим образцом.

 $ cat b.txt <@U39RFF91U> for all the help in this project! Thanks for your help to enhance the data quality <@U2UNRTLBV> <@U39RFF91U> <@U2UQCN023>! $ cat c.txt U39RFF91U Person1 U2UNRTLBV Person2 $ var="$(cat b.txt)";while read -r id name;do var="${var//@$id/$name}";done<c.txt #Batch Solution $ echo "$var" <Person1> for all the help in this project! Thanks for your help to enhance the data quality <Person2> <Person1> <@U2UQCN023>! $ while read -r id name;do sed -i "s/\@$id/$name/g" b.txt;done<c.txt #SED solution $ cat b.txt <Person1> for all the help in this project! Thanks for your help to enhance the data quality <Person2> <Person1> <@U2UQCN023>! 

Файл B:

 U39RFF91U Person1 U2UNRTLBV Person2 

Файл A, как указано, например, <@U39RFF91U> в тексте.


Простой рабочий код (однострочный):

 sed -e "$(sed -E 's_^([^[:space:]]+)[[:space:]]+(.*)$_s/<@\1>/\2/g_' file_B)" file_A 

По существу, эквивалентно:

 sed -e "$(sed 's_ *_>/_;s_^_s/<@_;s_$_/g_' file_B)" file_A 

(Только разница не в обработке символов табуляции).


Возможно, вы захотите исправить результат. Похоже, вы наверняка пропустите некоторые запятые, чтобы он был хорошим английским.

 sed -r 's#(\S+)\s+(.*)#s/<@\1>/\2/g#' map | sed -f- data 

Это необходимый выход. для проверки defind person 1 как upkar. Кроме того, имя пользователя не является жестко запрограммированным, оно будет ссылаться только на файл B

Мой скрипт

IFS = $ '\ п'

для пользователя в $ (cat B)

делать

userid = $ (echo $ user | awk -F "" '{print $ 1}')

username = $ (echo $ user | awk -F "" '{print $ 2}')

sed -i '/ <@' $ userid '> /' $ username '/ g' A

сделанный

Ссылка B файл

U39RFF91U Upkar

U2UNRTLBV Karup

вывод

Upkar. за всю помощь в этом проекте!

Благодарим за помощь в повышении качества данных Karup Upkar <@ U2UQCN023>!

Спасибо за <@ U38F4TBQ9> <@ U38F5PQ73> <@ U38F747CZ> <@ U39RT0G07> и <@ U2UQ17U20>. Отличная работа в Новом продукте!

Успешный выпуск! <@ U2WHAAU9H> <@ U2ML3C551> <@ U38F4TBQ9> <@ U38F747CZ> <@ U39RT0G07> <@ U2UQ17U20> <@ U38F5PQ73> <@ U2N64H7C6>!

Хвалите <@ U2X0APW3Y> за то, чтобы идти дальше и дальше, чтобы помочь в розничной кампании!

  • Как извлечь и объединить значения переменных в другую переменную?
  • сценарий оболочки, чтобы присоединиться к 2 файлам на основе 2 столбцов, и если совпадение найдено, напишите несколько полей
  • Захватить последнюю выполненную команду из истории как строку и сохранить в переменной в bash
  • Поиск файлов, более новых, чем другой файл в каждом подкаталоге
  • Как написать вывод на экран из службы systemd во время загрузки?
  • Как найти конкретную строку и распечатать всю строку?
  • Как создать исполняемый скрипт bash для этих команд?
  • Команды трубопровода на «тройники» предотвращают изменения переменных среды
  • Как я могу поддерживать разрывы строк в тексте тела с mailx при отправке вложений?
  • Loop sed из шаблона с различными выходами из текстового файла, содержащего переменные
  • Есть ли способ создать новый файл и вставить текст в этот файл с помощью bash?
  • Как написать очень простую оболочку, которая предоставляет параметры по умолчанию?
  • Interesting Posts

    Способ хранения / запоминания команд одного лайнера

    Uptime и кто -b показывают разные времена, когда система загружалась последним в Linux

    Может ли путь -prefix быть таким же, как каталог, в который я загрузил / распаковал исходный код?

    Почему переменная $ PATH отличается между двумя каталогами?

    Почему система X Window использует сервер?

    Отключить буферизацию в конфигурации виртуальной машины

    Используйте значения rEFInd live usb, чтобы исправить Grub2

    Редактирование nsswitch.conf для проверки файлов, отличных от / etc / passwd, при поиске локальных файлов для деталей пользователя

    Маршрутизация мобильных соединений для нескольких восходящих линий

    Как установить LANG в локали, несмотря на то, что он находится в / etc / default / locale в ubuntu для поддержки Unicode?

    Как подключиться через LAN-провод и WIFI-маршрутизатор к Интернету (только терминал)

    Как OSX обрабатывает условия отсутствия памяти?

    sed заменить на backspace

    Перенаправить stdout программы командной строки Windows под вином

    Вырезать поле в строке с bash

    Linux и Unix - лучшая ОС в мире.