sed 命令删除找到的匹配项

sed command to strip a match found

我有一个文件 "fruit.xml",如下所示:

FRUIT="Apples"
FRUIT="Bananas"
FRUIT="Peaches"

我想使用单个 SED 行命令查找所有出现的 NAME=",我想从找到的所有匹配项中删除 "" 之间的值。

所以结果应该是这样的:

Apples
Bananas
Peaches

这是我正在使用的命令:

sed 's/.*FRUIT="//' fruit.xml

问题是它把最后一个 " 留在了我需要的值的末尾。例如:Apples".

只需捕获该组并将其打印回来:捕获从 " 开始的所有内容,直到使用 () 找到另一个 "(如果您不这样做,则为 \(...\)使用 -r 选项)。然后,用 </code>:</p> 打印回来 <pre><code>$ sed -r 's/.*FRUIT="([^"]*)"//' file Apples Bananas Peaches

您还可以在 awk 中使用字段分隔符:告诉 awk 您的字段分隔符是 FRUIT=""。这样,所需的内容就变成了第二个字段。

$ awk -FS='FRUIT="|"' '{print }' file
Apples
Bananas
Peaches

要使您的命令生效,只需去掉行尾的 "

$ sed -e 's/.*FRUIT="//' -e 's/"$//' file
      ^^                 ^^^^^^^^^^^
      |                  replace " in the end of line with nothing
      -e to  allow you use multiple commands

如果你想保留前导空格,这就足够了,

sed 's/\bFRUIT="\([^"]*\)"//' fruit.xml

sed 's/\bFRUIT="\|"//g' fruit.xml

试试这个,这会用引号中的 founded fruit 替换行:

sed 's/.*FRUIT="\(.*\)"//' test.xml

使用简单的 cut 命令

cut -d '"' -f2 fruits.xml

输出:

Apples
Bananas
Peaches

假设每个值出现 1 次并采用这种格式

sed 's/.*="//;s/".*$//' fruit.xml