外壳脚本,"sed"用法,文件中的字符串替换



我知道这个问题以前可能已经回答过了。我在各个地方看到了很多关于这个的帖子,但答案对我不起作用。我正在寻找有关"sed"命令的示例用法的帮助。

我正在尝试做的是从文件中读取一些字符串,然后使用这些值替换其他几个文件的字符串

例:

File1.txt
name:
abcd
age:
22
File2.xml
<root>
 <name>xxxx</name>
 <age>xxxx</age>
</root>

我正在从文件 1 中读取名称和年龄,并尝试替换文件 2 中的缺失值。我尝试使用硬编码并替换文件中的值:

$name=abcd
$age=22
sed -e 's/.*<name>([^<]*)</name>.*/${name}/g' file2.xml

注意:无法使用 sed -i。 我猜旧版本

对于上面的脚本,我收到一个错误

sed: 0602-404 Function s/.*<name>([^<]*)</name>.*/${name}/g cannot be parsed.

所以首先,我想要一个脚本从文件中读取,然后一个脚本写入文件而不创建新文件

更新:

对于下面添加的 $ 标记

$ sed -e 's/.*<name>([^<]*)</name>.*/${name}/g' file2.xml

我收到错误./test.sh: line 4: $: command not found

首先,你需要""而不是''来获取变量的value。而且,您应该改用capture group

$ sed -r -e "s|(.*<name>)[^<]+(</name>)|1${name}2|g" -e "s|(.*<age>)[^<]+(</age>)|1${age}2|g" File2.txt
<root>
 <name>abcd</name>
 <age>22</age>
</root>

或者只是把${name}放在''外面:

$ sed -r -e 's|(.*<name>)[^<]+(</name>)|1'${name}'2|g' -e 's|(.*<age>)[^<]+(</age>)|1'${age}'2|g' File2.txt
<root>
 <name>abcd</name>
 <age>22</age>
</root>

PS:也许不能有File2.txt的write permission,所以你不能使用-i.bak

您可以选择

使用awk,这是一种更直接的方法。

使用以下命令:

awk 'NR==FNR{
  if(match($0,/name/)){getline;name=$0}
  if(match($0,/age/)){getline;age=$0}
  next}
  /<name>/{gsub(/>.*</,">"name"<",$0)}
  /<age>/{gsub(/>.*</,">"age"<",$0)}
  {print}
' File1.txt File2.xml  

输出:

<root>
 <name>abcd</name>
 <age>22</age>
</root>

简要说明:

  1. match():从File1.txt中提取姓名和年龄
  2. gsub():替换File2中的姓名和年龄.xml

最新更新