Shell Scripting,' sed'用法,文件中的字符串替换

时间:2017-06-15 06:16:53

标签: bash shell sed scripting

我知道这个问题可能已经得到了回答。我在不同的地方看到过很多关于这个问题的线索,但答案对我不起作用。我正在寻找帮助,例如使用' 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.

首先,我希望脚本从文件中读取,然后使用脚本写入文件,而不创建新文件。

更新:

以下添加的$ mark

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

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

2 个答案:

答案 0 :(得分:1)

首先,您需要""而不是''来获取变量的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

答案 1 :(得分:0)

您可以选择使用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():提取名称&amp;年龄从File1.txt
  2. gsub():替换姓名&amp; File2.xml中的年龄