web-dev-qa-db-ja.com

sedを使用して部分文字列を抽出する方法

次の行を含むファイルがあります。

  <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>

このファイルでコマンドを実行して、次の出力に表示されているパラメーター名のみを抽出します。

$sedcommand file.txt
PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription

このコマンドは何でしょうか?

44
MOHAMED

awkが必要です。

これは迅速で汚いハックになります。

awk -F "\"" '{print $2}' /tmp/file.txt

PortMappingEnabled
PortMappingLeaseDuration
RemoteHost
ExternalPort
ExternalPortEndRange
InternalPort
PortMappingProtocol
InternalClient
PortMappingDescription
33
Chris

grepはものを抽出するために生まれました:

grep -Po 'name="\K[^"]*'

データを使用してテストします。

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
81
Kent

sed 's/[^"]*"\([^"]*\).*/\1/'

仕事をします。

54
unxnut

Sedやawkなどのツールを使用してXMLを解析しないでください。エラーが発生しやすいです。

入力が変更され、nameパラメーターの前にスペースではなく改行文字が表示されると、いつかは失敗し、予期しない結果が生じます。

入力が常にこの方法でフォーマットされることを本当に確信している場合は、cutを使用できます。 sedおよびawkよりも高速です。

cut -d'"' -f2 < input.txt

最初に解析し、パラメータ名属性のみを抽出する方が良いでしょう:

xpath -q -e //@name input.txt | cut -d'"' -f2

Xpathの詳細については、このチュートリアルを参照してください。 http://www.w3schools.com/xpath/

16
Michał Šrajer

cutの使用方法の説明:

cat yourxmlfile | cut -d'"' -f2

"d elimiterに基づいてファイル内のすべての行を「カット」し、2 nd f ield、これはあなたが望んだものです。

5
Rushi Agrawal