我知道这个问题以前可能已经回答过了。我在各个地方看到了很多关于这个的帖子,但答案对我不起作用。我正在寻找有关"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>
简要说明:
-
match()
:从File1.txt
中提取姓名和年龄 -
gsub()
:替换File2中的姓名和年龄.xml