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

У меня есть два файла: 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> за то, чтобы идти дальше и дальше, чтобы помочь в розничной кампании!

  • получить бесплатную строку жанра id3-tag, а не только номер жанра в сценарии bash
  • Ошибка перенаправления Sub Shell с переменной (while ...) $ 3> $ testdir / $ testfile.log
  • Прочитайте файл и прокомментируйте строку, соответствующую строке, с помощью сценария оболочки
  • Сортировка файлов в соответствии с их расширениями
  • Изменить каталог рабочего каталога в сценарии оболочки
  • Что означает `1 >>` и `2 >>` в сценарии bash?
  • Запуск сценария при запуске и после переключения сети
  • установка псевдонима для Java9
  • Использование awk для объединения двух файлов csv на три поля также создает новый файл csv
  • Перезапустить брандмауэр из файла bash
  • Работает в командной строке, но не в сценарии оболочки
  • Interesting Posts

    «TeamViewer не готов. Пожалуйста, проверьте свою связь "ошибка в Fedora 25

    Указание шрифта с текстом

    Как заморозить текущий заказ задачи?

    qemu-img конвертирует горящий CPU ни для чего

    Может ли rsync хранить подстановочные имена (возможно, используя переменную)?

    получить имя интерфейса хоста, используемое интерфейсом VirtualBox в «мостовом режиме»,

    Сохранять соотношение экрана при максимальном использовании mplayer

    Нет домашнего каталога, вход в систему с HOME = /

    Как настроить `sudo yum install …` инструкции по установке пакетов под `$ HOME / .hostdir` без привилегий суперпользователя?

    Конфигурация связывания на блейд-сервере с Oracle 6.3

    Изменение UUID файловой системы BTRFS

    AltGr не работает как клавиша 3 уровня выбора

    Существуют ли технические ограничения, предотвращающие поддержку root = UUID = <filesystem-uuid>?

    Почему в этом простом случае не является седой жадный?

    В чем разница между командами sed `n` и` b`?

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