私のLinuxコンピュータには次のファイルがあります。
<names>
<first_name>Mohammed Sani</first_name>
<last_name>ABACHA</last_name>
<aliases>
<alias>ABACHE,Mohammed Sani</alias>
<alias>SANI,Mohammed</alias>
</aliases>
<low_quality_aliases>
<alias xsi:nil="true"/>
</low_quality_aliases>
<alternative_spelling xsi:nil="true"/>
</names>
次のコマンドを使用して名前を印刷しますが、名前のみを印刷します。
sed -n 's:.*<first_name>\(.*\)</first_name>.*:\1:p' 'test.xml' > name.txt
姓を追加するにはどうすればよいですか?
ベストアンサー1
名前と姓データが同じ行にあり、その間にタブがあることを望んでいるとします。
使用xmlstarlet
:
xmlstarlet sel -t -m '/names' \
-v 'first_name' -nl \
-v 'last_name' -nl file.xml 2>/dev/null |
paste - -
このコマンドは、そのノードとその下のノードの値を解析し、それぞれxmlstarlet
1行ずつ出力します。first_name
last_name
names
タブ文字を区切り文字として使用して、出力の2行を1行に貼り付けますpaste
。たとえば、withを使用する-d ','
とpaste
、カンマ区切りの出力を取得できます。
/dev/null
後でドキュメントにxmlstarlet
正しいいくつかの偽の名前空間宣言があるため、標準エラーストリームにリダイレクトします。
xq
以下で使用https://kislyuk.github.io/yq/:
xq -r '.names | [ .first_name, .last_name ] | @tsv' file.xml
これは@tsv
演算子を使用してタブ区切りの出力を生成します。上記のコードと同じデータを出力しますxmlstarlet
が、XPath式の代わりに式を使用しますjq
。
代わりに、完全に引用されたCSV出力を@tsv
取得してください。@csv