我有一个充满HTML属性的巨大文本文件。我只需要标签的值。例:
<option value="API" datatype="string" datatype_value="0">API</option>
<option value="Account" datatype="string" datatype_value="0">Account</option>
<option value="Address - asn" datatype="string" datatype_value="0">Address - asn</option>
我只想在'option value'后面加上"API"
现在我有这个:
awk -F "option value=" '{print $2}' /inputFilePath | awk '{print $1}'
I可以,但是只能在文件的第一行使用。所以当我在文件上运行上面的命令时,我的输出只返回:
"API"
而不是"Account", "Address"或后面的任何东西。
有什么想法我可能做错了吗?提前感谢!
修改RS:
awk 'BEGIN { RS = "<option value="" ; FS = """; } NF { print $1 }' file
输出:API
Account
Address - asn
我只希望它适用于你的awk
,因为nawk
不行。
另一个使用GNU awk:
gawk '{ t = $0; while (match(t, /<option value="([^"]*)"(.*)/, a)) { print a[1]; t = a[2] } }' file
我明确地使用[^"]*
,因为我发现空值仍然对您的查询有效,但如果您愿意,您可以将其更改为[^"]+
。
这应该适用于所有awk
awk -F"<option value=" '{split($2,a,""");print a[2]}' file
API
Account
Address - asn
如果你需要双引号:
awk -F"<option value=" '{split($2,a,""");print """a[2]"""}' file
"API"
"Account"
"Address - asn"
症状表明可能您的<option>
元素在单个行上,而不是每个元素在其自己的行上。
Update: OP到目前为止还没有提供关于原始问题的反馈,但是考虑到接受的答案无论单行是否包含多个元素还是只有一个都有效,上述猜测是可能的。
(这个答案最初包含一个次优的sed
解决方案,前两个评论引用-我已经删除了它。)
如果您可以使用GNU awk
或mawk
,那么接受的答案对于特定的问题来说是一个很好的解决方案。
一般来说,使用专用的HTML/xml解析命令行 更可取——它真正地理解数据的结构,并提供更健壮和灵活的方法来提取数据
。例如,使用多平台web抓取CLI xidel,解决方案将简化为:
xidel -q -e '//option/@value' file
-
//option/@value
是一个XPath查询,它在DOM的所有层次上选择所有option
元素的value
属性(根据需要更具体)。 - 默认情况下,xidel只提取匹配节点的内容,并在单独的行上打印每个节点的内容。
- 作为一个HTML解析器,xidel可以正确解析HTML,而不考虑非重要空白的变化-无论感兴趣的元素分布在多少行。
在示例代码中添加$1 ~/API/。awk -F "option value=" '{print $2}' /inputFilePath | awk '$1 ~ /API/ {print $1}'