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

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

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

  • Подсчитайте количество вхождений значения столбца в TSV-файл с AWK
  • Как сопоставить шаблон, удалить шаблон, а также следующую и предыдущую строку в Solaris 10
  • Как заменить пользовательскую строку даты в текстовом файле
  • Обход фрагмента nawk, если входной файл пуст
  • Как найти файлы с тем же именем, но разные строки в двух каталогах?
  • Grep вся строка, которая не начинается с числа (ей)
  •  <@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?

  • Как найти файлы, их имена, имена файлов находятся в одном файле?
  • Как я могу получить правильное время окончания команды nohup?
  • Есть ли ссылка для ассемблерного вывода, созданного `awk -W dump`?
  • Функция stateful bash
  • Изменяйте определенные байты во многих файлах
  • Получение информации из журналов с использованием grep, sed, awk и cut
  • 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> за то, чтобы идти дальше и дальше, чтобы помочь в розничной кампании!

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