Вы можете использовать stat
в произвольном формате.
stat -c'%s' summary.pdf
выведет фактический размер файла в байтах. Если вам нужны выделенные блоки, используйте % b
для количества выделенных блоков и % B
для размера каждого блока в байтах.
Это также работает с подстановочными знаками и дополнительным % n
для имени файла. См. Страницу руководства для получения дополнительных параметров формата.
Может быть выполнено с помощью 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>!
Файл 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
сценарий редактирования, например, такой:
$ 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