MOH*_*MED 48 linux shell ubuntu sed xml-parsing
我有一个包含以下行的文件:
<parameter name="PortMappingEnabled" access="readWrite" type="xsd:boolean"></parameter>
<parameter name="PortMappingLeaseDuration" access="readWrite" activeNotify="canDeny" type="xsd:unsignedInt"></parameter>
<parameter name="RemoteHost" access="readWrite"></parameter>
<parameter name="ExternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="ExternalPortEndRange" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="InternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="PortMappingProtocol" access="readWrite"></parameter>
<parameter name="InternalClient" access="readWrite"></parameter>
<parameter name="PortMappingDescription" access="readWrite"></parameter>
Run Code Online (Sandbox Code Playgroud)
我想在此文件上执行命令以仅提取以下输出中显示的参数名称:
$sedcommand file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription
Run Code Online (Sandbox Code Playgroud)
这个命令可能是什么?
Ken*_*ent 85
grep诞生于提取事物:
grep -Po 'name="\K[^"]*'
Run Code Online (Sandbox Code Playgroud)
测试您的数据:
kent$ echo '<parameter name="PortMappingEnabled" access="readWrite" type="xsd:boolean"></parameter>
<parameter name="PortMappingLeaseDuration" access="readWrite" activeNotify="canDeny" type="xsd:unsignedInt"></parameter>
<parameter name="RemoteHost" access="readWrite"></parameter>
<parameter name="ExternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="ExternalPortEndRange" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="InternalPort" access="readWrite" type="xsd:unsignedInt"></parameter>
<parameter name="PortMappingProtocol" access="readWrite"></parameter>
<parameter name="InternalClient" access="readWrite"></parameter>
<parameter name="PortMappingDescription" access="readWrite"></parameter>
'|grep -Po 'name="\K[^"]*'
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription
Run Code Online (Sandbox Code Playgroud)
unx*_*nut 57
sed 's/[^"]*"\([^"]*\).*/\1/'
做的工作.
Chr*_*ris 35
你想要的awk
.
这将是一个快速而肮脏的黑客:
awk -F "\"" '{print $2}' /tmp/file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription
Run Code Online (Sandbox Code Playgroud)
Mic*_*jer 16
您不应该使用sed或awk等工具解析XML.这很容易出错.
如果输入更改,并且在name参数之前,您将获得换行符而不是空格,它将在某一天失败,从而产生意外结果.
如果您确定,您的输入将始终以这种方式格式化,您可以使用cut
.它的速度比sed
和awk
:
cut -d'"' -f2 < input.txt
Run Code Online (Sandbox Code Playgroud)
最好先解析它,并仅提取参数名称属性:
xpath -q -e //@name input.txt | cut -d'"' -f2
Run Code Online (Sandbox Code Playgroud)
要了解有关xpath的更多信息,请参阅本教程:http://www.w3schools.com/xpath/
说明如何使用cut
:
cat yourxmlfile | cut -d'"' -f2
它将“剪切”根据文件中的所有行“ d elimiter,并且将采取2次˚F ield,这是你想要的。
归档时间: |
|
查看次数: |
129705 次 |
最近记录: |