我在文件中有这两行:
<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
我希望使用awk或sed获取以下内容:
3
50000
使用此sed命令无法正常工作,我怀疑这是由于我的行条目中存在引号和分隔符。
sed -n '/WORD1/,/WORD2/p' /path/to/file
如何从文件中提取我想要的值?
答案 0 :(得分:5)
awk -F'[<>]' '{print $3}' input.txt
input.txt中:
<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
输出:
3
50000
答案 1 :(得分:1)
对我来说看起来像XML,所以假设它是某些有效XML的一部分,例如
<root>
<first-value system-property="unique.setting.limit">3</first-value>
<second-value-limit>50000</second-value-limit>
</root>
您可以使用Perl的XML::Simple并执行以下操作:
perl -MXML::Simple -E '$xml = XMLin("file"); say $xml->{"first-value"}->{"content"}; say $xml->{"second-value-limit"}'
输出:
3
50000
如果XML结构更复杂,那么您可能需要深入钻取以获得所需的值。如果是这种情况,您应该编辑问题以显示更大的图片。
答案 2 :(得分:0)
使用sed
:
sed -E 's/.*limit"*>([0-9]+)<.*/\1/' file
说明:
.*
负责处理字符串 limit
limit"*
负责两行,一行limit"
,另一行limit
([0-9]+)
负责匹配您的要求中所述的数字和数字。
\1
实际上是捕捉模式的捷径。当模式将其全部或部分内容分组为一对括号时,它会捕获该内容并将其临时存储在内存中。有关详细信息,请参阅https://www.inkling.com/read/introducing-regular-expressions-michael-fitzgerald-1st/chapter-4/capturing-groups-and
答案 3 :(得分:0)
sed -e 's/[a-zA-Z.<\/>= \-]//g' file
答案 4 :(得分:0)
带参数扩展的脚本解决方案:
#!/bin/bash
while read line || test -n "$line" ; do
value="${line%<*}"
printf "%s\n" "${value##*\>}"
done <"$1"
<强>输出:强>
$ ./ltags.sh dat/ltags.txt
3
50000
答案 5 :(得分:0)
Ashkan的 awk 解决方案非常简单,但我建议使用 sed 解决方案接受非整数:
sed -n 's/[^>]*>\([.[:digit:]]*\)<.*/\1/p' input.txt
这将提取该行的第一个>
字符与以下<
之间的数字。在我的RE&#34;数字&#34;可以是空字符串,如果您不想接受空字符串,请将-r
选项添加到 sed ,并将\([.[:digit:]]*\)
替换为([.[:digit:]]+)