このXMLを次に変換したいと思います。確認する互いに接続された線。これにより、後で特定の行だけをキャッチできます。このXMLが属性を使用した場合、データはすでに1行にあります。これを行うためにXSLTを使用したくありません。 grep、sed、awk、xmlstarlet、xpathが良いでしょう。
したがって、1行にが含まれている場合は、"<instruction>"
次の4行を取得し、すべて1行に配置する必要があります。カンマはありません。次のようになります。
投稿された質問とは異なります。ここ:「参加」順序を開始する日付としてモードを設定します。
awk '
/\<instruction\>/ && line {print line; line=""}
{line = line ? line" "$0 : $0}
END {print line}
'
これにより、行が閉じるタグに縮小されますが、閉じるタグ行自体は導入されません。
プラットフォームは Windows 2012R2 サーバーにあります。 Gnuユーティリティがインストールされます。ファイルサイズは約100kです。
<instruction>
<name>AAAAA</name>
<value>WHITE</value>
<type>0</type>
</instruction>
<instruction>
<name>BBBBB</name>
<value>WHITE</value>
<type>0</type>
</instruction>
<instruction>
<name>CCCCC</name>
<value>WHITE</value>
<type>0</type>
</instruction>
<routing/>
<phantom>False</phantom>
<AssemblyHistory/>
必要な出力:(改行できますが、ディレクティブ要素はすべて1行にする必要があります)
<instruction><name>AAAAA</name><value>WHITE</value><type>0</type></instruction>
<instruction><name>BBBBB</name><value>WHITE</value><type>0</type></instruction>
<instruction><name>CCCCC</name><value>WHITE</value><type>0</type></instruction>
<routing/>
<phantom>False</phantom>
<AssemblyHistory/>
同様の例(無効なXML)
data line 2
cust:
tommy
smith
123 main
endcust
data line 16
TRACE: error at xy123
cust:
mary
smith
444 broadway
endcust
LOG: logon tty3
LOG: free memory before gc 33453211
root: ps -ealf tty0
data line 2
cust: tommy smith123 main endcust
data line 16
TRACE: error at xy123
cust:mary smith444 broadway endcust
LOG: logon tty3
LOG: free memory before gc 33453211
root: ps -ealf tty0
行を省略せずにファイル全体を標準出力にコピーします。 "cust:"を見つけたら、次のいずれかを実行できます。 1)次の4行を結合するか、2)「終了」が見つかるまで行を結合します。
同様ですが、今回はXMLツールを使用できません。それでは、このような状況が発生した場合はどうすれば解決しますか?最も重要な質問がXMLであれば良いです。そうでない場合は、2番目の例を使用してください。
ベストアンサー1
sedの範囲演算子を使用して問題を解決できますが、その前に同じ行でトークンを処理してフラグを解除する必要があります。同じ行にある複数のタグも処理されません。
sed -e '
s/^[[:blank:]]*//
\|<instruction>.*</instruction>|b
\|<instruction>|,\|</instruction>|!b
H;\|</instruction>|!d
s/.*//;x;s/\n[[:blank:]]*//g;s/^\n//
' input_xml_lookalike_file