공백으로 구분된 테이블에 여러 행의 데이터를 출력하는 프로그램이 있습니다. 이 출력을 세미콜론으로 구분된 목록으로 변환해야 합니다.
이것은 샘플 기록입니다. 각 필드에는 특정 수의 문자가 있고 특정 수의 공백으로 채워지지만, 필드의 문자 수와 패딩 공백은 아래와 같이 필드에 따라 다릅니다.
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD.WithSpace....<etc>
FIELD.FIELD2x...FIELD3xxxx.....FIELD4xxxxxxxxx.....FIELD5xxxxxxxxx....<etc>
일반적으로 다음과 같은 작업을 수행하는 데에는 문제가 없습니다.
command | tr -s ' ' ';'
이상적으로는 다음과 같은 결과를 생성합니다.
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
그러나 위에서 언급한 것처럼 필드 자체에 공백이 포함될 수 있으며 문제를 복잡하게 만들기 위해 따옴표 없이 인쇄됩니다. 그럼 위의 명령어를 실행해 보세요"tr -s ' ';'"이 명령은 실제로 다음을 수행합니다.
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD5xxxxxxxxx;<etc>
FIELD;FIELD2x;FIELD3xxxx;FIELD4xxxxxxxxx;FIELD;WithSpace;<etc>
^ <-- Problem here :(
값에 공백이 포함된 필드를 삭제하지 않고 이 데이터에서 세미콜론으로 구분된 목록을 만드는 방법은 평생 알 수 없습니다. 누구든지 이 문제를 해결하는 방법을 알고 있다면 좋을 것입니다!
답변1
먼저 모든 필드 값을 전처리하고 필드 형식을 감지하여 정규식으로 변환한 다음 구분 기호를 추가하기 전에 텍스트를 정규화해야 한다고 생각합니다.
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD5xxxxxxxx <etc>
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD5xxxxxxxx <etc>
FIELD FIELD2x FIELD3xxxx FIELD4xxxxxxxxx FIELD 7xxx <etc>
정규식 필드 형식:
(FIELD[\s\dx]+)
==> 사용sed/앗...새 필드 형식으로 업데이트됨 ==> 구분 기호가 추가되었습니다.