用于删除匹配的sed命令

时间:2015-01-09 13:29:13

标签: linux bash unix awk sed

我有一个文件" fruit.xml"看起来如下所示:

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

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

所以结果应该是这样的:

Apples
Bananas
Peaches

这是我正在使用的命令:

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

问题是它将最后"留在我需要的值的末尾。例如:Apples"

5 个答案:

答案 0 :(得分:5)

抓住小组并将其打印回来:抓住"的所有内容,直到"找到另一个()(如果您不使用\(...\),则抓住-r \1选项)。然后,使用$ sed -r 's/.*FRUIT="([^"]*)"/\1/' file Apples Bananas Peaches 打印回来:

awk

您还可以将字段分隔符与awk一起使用:告诉FRUIT="您的字段分隔符为"$ awk -FS='FRUIT="|"' '{print $2}' 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

{{1}}

答案 1 :(得分:1)

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

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

OR

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

答案 2 :(得分:0)

试试这个,这将用引号中的已建立的水果替换该行:

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

答案 3 :(得分:0)

使用简单的cut命令

cut -d '"' -f2 fruits.xml

输出:

Apples
Bananas
Peaches

答案 4 :(得分:0)

假设每个值出现1次且格式为

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