如何用文件中的内容替换文档中的占位符字符串

如何用文件中的内容替换文档中的占位符字符串

我有两个文件,A并且B.

FileA是一个字母,如下所示,每行包含几个占位符字符串,例如<@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是一个映射表,将所有用户ID映射到每个用户的名字:

U39RFF91U  Person1
U2UNRTLBV  Person2

我想制定一个最终文件 ,C其中包含 中字母的内容A,但所有占位符都替换为 file 中映射表中的相应内容B

知道如何在 Linux 上通过 shell 脚本来做到这一点吗?

答案1

您可以将映射转换为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

答案2

可以使用 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>!

答案3

文件B:

U39RFF91U  Person1
U2UNRTLBV  Person2

<@U39RFF91U>文件 A 如文中所述,例如。


简单的工作代码(一行):

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

(唯一的区别是不处理制表符。)


您可能想要校对结果。看来你很可能会漏掉一些逗号,这样才算是好的英语。

答案4

sed -r 's#(\S+)\s+(.*)#s/<@\1>/\2/g#' map | sed -f- data

相关内容