我有一个文件file.txt
。其中有以下三个记录。
<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/
:找到in.*ResultDescxmlns.*>(.*)
之后的行 get string的匹配项>
\1
N;N;
: 将接下来的两行添加到当前行
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