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
我有一个文件 "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