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

Вы можете использовать stat в произвольном формате.

stat -c'%s' summary.pdf 

выведет фактический размер файла в байтах. Если вам нужны выделенные блоки, используйте % b для количества выделенных блоков и % B для размера каждого блока в байтах.

Это также работает с подстановочными знаками и дополнительным % n для имени файла. См. Страницу руководства для получения дополнительных параметров формата.

2
28.01.2017, 11:49
4 ответа

Может быть выполнено с помощью 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

Это решение может работать медленнее, если файл карты / текстовый файл довольно большой, поскольку внешнее приложение 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>!
1
27.01.2020, 21:56

Файл 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

(Единственное отличие - отсутствие обработки символов табуляции.)


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

0
27.01.2020, 21:56

Вы можете преобразовать сопоставления в 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
5
27.01.2020, 21:56
sed -r 's#(\S+)\s+(.*)#s/<@\1>/\2/g#' map | sed -f- data
0
27.01.2020, 21:56

Теги

Похожие вопросы