Jat*_*yap 4 command-line sed text-processing
我有一个文件input.xml
,其中包含一行:<exciton lambda="1" fix="hole"/>
在该行中,我想将 1 替换为 2 但我不能仅用作1
关键字,因为同一文件中还有“1”的其他实例,因此我必须使用关键字lambda="1"
我正在尝试使用 sed 命令,如下所示:
sed -i "s/lambda="1"/lambda="$value"/g" input.xml
Run Code Online (Sandbox Code Playgroud)
但它不起作用,任何人都可以帮忙。
首先,尝试使用正则表达式解析 XML 或其他此类结构化文本绝不是一个好主意。虽然理论上可以做到安全且良好,但即使对于专家来说也是极其困难的。最好使用专门为处理您所拥有的语言而设计的工具。因此,如果这是一个 XML 文件,您可以使用类似的东西xmlstarlet
来代替。例如,给定以下输入文件:
$ cat file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1" fix="hole"/>
</record>
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
$ value="1234"
$ xml ed -u "//record[@id=1]/exciton/@lambda" -v "$value" file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1234" fix="hole"/>
</record>
Run Code Online (Sandbox Code Playgroud)
话虽如此,只要您提供给我们的信息非常少,您就可以使用像sed
. 您可以尝试多种技巧。首先,转义双引号:
$ sed "s/lambda=\"1\"/lambda=\"$value\"/" file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1234" fix="hole"/>
</record>
Run Code Online (Sandbox Code Playgroud)
或者,使用单引号,但将其结束并将带引号的变量插入单引号之外。然后,打开一个新的单引号字符串来继续sed
表达式:
$ sed 's/lambda="1"/lambda="'"$value"'"/' file.xml
<?xml version="1.0"?>
<record id="1">
<exciton lambda="1234" fix="hole"/>
</record>
Run Code Online (Sandbox Code Playgroud)
这个在视觉上有点难以解析,但这就是它通过添加空白来提高易读性所做的事情(请注意,它实际上并不适用于添加的空白,这只是为了清楚起见):
sed 's/lambda="1"/lambda="' "$value" '"/' file.xml
Run Code Online (Sandbox Code Playgroud)
你有两个选择。首先,你可以简单地逃避双重