유닉스에서 파일 형식을 지정하는 방법

유닉스에서 파일 형식을 지정하는 방법

파일이 있습니다 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

관련 정보