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

У меня есть два файла: 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?

  • Как grep только на последнем столбце?
  • Можно ли создать zip-файл без использования zip-бинарного файла?
  • Восстановление tty с помощью stty
  • Скрипты многотомных (GNU) `tar` с заранее определенным количеством томов
  • Тайм-аут `idql` в ksh
  • для цикла, не работающего для нескольких строк
  • Как извлечь первое целое из текстовой строки в столбце файла с разделителями табуляции?
  • wget не останавливается
  • 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> за то, чтобы идти дальше и дальше, чтобы помочь в розничной кампании!

    Interesting Posts

    Gnome-боксы не могут видеть виртуальные машины после сна

    bash regex для поиска и сохранения строки из файла

    положение курсора после вставки в vi / vim

    Как обновить сценарий инициализации

    Как повлиять на назначение подчиненных UID / GID при создании учетных записей пользователей?

    Как получить доступ к машине за ограниченным шлюзом NAT я не умею?

    Как изменить док-станцию ​​в XFCE4?

    Ubuntu wifi подключается и работает в течение 5 минут, затем перестает работать, оставаясь подключенным, нужна помощь

    В чем разница между выпуском и версией ядра / дистрибутива?

    Как определить, улучшает ли пользовательское ядро ​​производительность системы?

    Заблокировать пакет для удаления в APT

    Уменьшить блокировку диска io с помощью многих устройств?

    Обновление ядра linux с 3 по 4 в Debian 8

    Удалить дубликаты записей в текстовом файле

    сетевой менеджер не перечисляет wifi

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