파일이 있습니다 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/
.*ResultDescxmlns.*>(.*)
: in 뒤의 줄에서 get 문자열과 일치하는 항목을 찾습니다.>
\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