.txtファイルからlast_nameを印刷する方法は?

.txtファイルからlast_nameを印刷する方法は?

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

このコマンドは、そのノードとその下のノードの値を解析し、それぞれxmlstarlet1行ずつ出力します。first_namelast_namenames

タブ文字を区切り文字として使用して、出力の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

おすすめ記事