ファイルがありますfile.txt
。その中には、次の3つの記録があります。
<ResultDescxmlns="http://www.mpaet.com/boe/interface/common">Operation successful.
220095
9251000014
今私が望む形式は以下のようになります。
9251000014|220095|作業成功
答え1
「perl」と正規表現の使用
perl -0777 -pe 's/<ResultDescxmlns=.*?>([^\n]*).([^\n]*).([^\n]*)/\3|\2|\1/gs' file.txt
これにより、ラベルの後ろの3行が抽出され、ResultDescxmlns
目的の順序に並べ替えられます。
答え2
sed
:
sed -rn 's/<ResultDescxmlns.*>(.*)/\1/;N;N;s/\n/ /g;s/([^.]*). ([0-9]*) ([0-9]*)/\3|\2|\1/p'
s/.*ResultDescxmlns.*>(.*)/\1/
.*ResultDescxmlns.*>(.*)
:in 後の行で、get 文字列に一致する項目を探します。>
\1
N;N;
:現在の行に次の2行を追加します。
s/\n/ /g
: 改行文字をスペースに置き換える
s/([^.]*). ([0-9]*) ([0-9]*)/\3|\2|\1/p
: 正規表現を一致させ、順序を並べ替えて目的の出力を取得します。
答え3
別の解決策は次のとおりです。
sed 's/^<[^>]*>//g' file.txt | tr '\012' '|' | awk -F'|' '{OFS=FS; print $3,$2,$1}'
9251000014|220095|Operation successful.
末尾を削除するには、または.
いずれかを使用します(両方を使用する必要はありません)sed
。awk
簡単な解決策は次のとおりですsed
。
sed -e 's/^<[^>]*>//g' -e 's/\.$//' file.txt
答え4
file.txtに3行しかない場合でも機能します。
l3=$(tail -1 file.txt)
l2=$(tail -2 file.txt | head -1)
l1=$(tail -3 file.txt | head -1 | cut -d">" -f2)
echo $l3"|"$l2"|"$l1