我知道这个问题可能已经得到了回答。我在不同的地方看到过很多关于这个问题的线索,但答案对我不起作用。我正在寻找帮助,例如使用' 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
答案 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>
简要说明:
match()
:提取名称&amp;年龄从File1.txt
gsub()
:替换姓名&amp; File2.xml中的年龄