Bash 使用awk从行中提取值

Bash 使用awk从行中提取值,bash,awk,sed,Bash,Awk,Sed,我在一个文件中有以下两行: <first-value system-property="unique.setting.limit">3</first-value> <second-value-limit>50000</second-value-limit> 使用这个sed命令并不像我所希望的那样工作,我怀疑这是因为我的行条目中存在引号和分隔符 sed -n '/WORD1/,/WORD2/p' /path/to/file 如何从文件中提取所需的

我在一个文件中有以下两行:

<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
使用这个sed命令并不像我所希望的那样工作,我怀疑这是因为我的行条目中存在引号和分隔符

sed -n '/WORD1/,/WORD2/p' /path/to/file

如何从文件中提取所需的值?

使用
sed

awk -F'[<>]' '{print $3}' input.txt
sed -E 's/.*limit"*>([0-9]+)<.*/\1/' file
sed-E's/*limit”*>([0-9]+)
sed-E's/[a-zA-Z.=\-]//g'文件

带有参数扩展的脚本解决方案:

#!/bin/bash

while read line || test -n "$line" ; do
    value="${line%<*}"
    printf "%s\n" "${value##*\>}"
done <"$1"

在我看来,它很像XML,所以假设它是一些有效XML的一部分,例如

<root>
<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
</root>
输出:

3
50000
3
50000

如果XML结构更复杂,那么您可能需要深入一点以获得所需的值。如果是这种情况,您应该编辑问题以显示更大的图景。

Ashkan的awk解决方案很简单,但我建议一种接受非整数的sed解决方案:

sed -n 's/[^>]*>\([.[:digit:]]*\)<.*/\1/p' input.txt

sed-n的/[^>]*>\([[::digit:]*\)酷,我不知道我可以设置多个字段分隔符。@martin更一般地说,如果
<…>
标记中有数字,你可以使用这个解决方案是不合适的,因为它会保留这些数字,并将它们连接到OP想要提取的实际数字。很多人编写
sed-E
,意思是
--extended regexp
。这是grep的正确短选项,但不适用于sed。在sed中(至少在GNU sed中),正确的
--regexp extended
缩写形式是
-r
。POSIX规范,但是。sed的手册页清楚地指出了
-r
,没有提到
-B
。此外,您建议的解决方案,这里的许多解决方案,都不适用于十进制数。
$ ./ltags.sh dat/ltags.txt
3
50000
<root>
<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
</root>
perl -MXML::Simple -E '$xml = XMLin("file"); say $xml->{"first-value"}->{"content"}; say $xml->{"second-value-limit"}'
3
50000
sed -n 's/[^>]*>\([.[:digit:]]*\)<.*/\1/p' input.txt