将 sed 与双引号内的变量一起使用

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)

但它不起作用,任何人都可以帮忙。

ter*_*don 5

首先,尝试使用正则表达式解析 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)

你有两个选择。首先,你可以简单地逃避双重