使用 sed 并将变量放在双引号内

使用 sed 并将变量放在双引号内

我有一个文件input.xml,其中包含一行:<exciton lambda="1" fix="hole"/>

在那一行中我想用 2 替换 1,但我不能使用1关键字,因为同一个文件中还有其他“1”的实例,所以我必须使用关键字lambda="1"

我正在尝试使用如下 sed 命令:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

但它不起作用,有人可以帮忙吗?

答案1

首先,从来不是一个好主意尝试使用正则表达式解析 XML 或其他此类结构化文本。虽然理论上可以很好地安全地做到这一点,但即使对于专家来说也极其困难。最好使用专门设计用于处理您所用语言的工具。因此,如果这是 XML 文件,您可以使用类似xmlstarlet而是。例如,给定这个输入文件:

$ cat file.xml
<?xml version="1.0"?>
<record id="1">
  <exciton lambda="1" fix="hole"/>
</record>

你可以这样做:

$ 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>

尽管如此,根据您提供的极少信息,您可以使用类似这样的简单、朴素的解析器来完成此操作sed。您可以尝试各种技巧。首先,只需转义双引号:

$ sed "s/lambda=\"1\"/lambda=\"$value\"/" file.xml
<?xml version="1.0"?>
<record id="1">
  <exciton lambda="1234" fix="hole"/>
</record>

或者,使用单引号,但结束它们并将引用的变量插入单引号外。然后,打开一个新的单引号字符串以继续表达式sed

$ sed 's/lambda="1"/lambda="'"$value"'"/' file.xml
<?xml version="1.0"?>
<record id="1">
  <exciton lambda="1234" fix="hole"/>
</record>

从视觉上看,这一点有点难以解析,但这是它为了易读性而添加的空格所做的事情(请注意,它实际上并不适用于添加的空格,这只是为了清楚起见):

sed 's/lambda="1"/lambda="'   "$value"   '"/' file.xml

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

答案2

我正在尝试使用如下 sed 命令:

sed -i "s/lambda="1"/lambda="$value"/g" input.xml

假设value已经定义,用单引号将变量括起来'$value'::

sed -i 's/lambda="1"/lambda="'$value'"/g' input.xml

编辑正如@terdon 指出的那样,如果您的value变量包含空格,则上述方法将不起作用,您需要在单引号内对变量进行双引号引用:

sed -i 's/lambda="1"/lambda="'"$value"'"/g' input.xml

相关内容