![쉘 스크립트를 사용하여 세미콜론으로 구분된 파일의 필드에서 공백 제거](https://linux55.com/image/88825/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%84%B8%EB%AF%B8%EC%BD%9C%EB%A1%A0%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%ED%95%84%EB%93%9C%EC%97%90%EC%84%9C%20%EA%B3%B5%EB%B0%B1%20%EC%A0%9C%EA%B1%B0.png)
다음과 같은 CSV 파일이 있습니다.
03139; 5; IT1234978208; 20150930 ; CTZ 13/31.12.15;
03137; 6; IT1234978206; 20151015 ; CTZ 13/31.11.18;
....
....
03134; 8; IT1234974406; 20151212 ; CTZ 13/37.13.17;
sed
Korn Shell의 명령을 사용하여 다음과 같은 결과를 얻음으로써 각 csv 줄에서 모든 공백을 제거하는 해결 방법을 찾고 있습니다 .
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;
누구든지 나를 도와줄 수 있나요?
답변1
세미콜론 앞이나 뒤의 공백만 제거하려는 것 같습니다. 이 경우:
$ sed 's/[[:space:]]*;[[:space:]]*/;/g' text
03139;5;IT1234978208;20150930;CTZ 13/31.12.15;
03137;6;IT1234978206;20151015;CTZ 13/31.11.18;
....
....
03134;8;IT1234974406;20151212;CTZ 13/37.13.17;
작동 방식:
sed 교체 명령은 일반적으로 정규 표현식이 s/old/new/
어디에 있는지 와 같습니다 . old
이 경우에는 g
다음을 나타내는 접미사를 추가합니다.글로벌교체(인스턴스 하나만 교체하는 대신). 이 예에서는 old
a ;
및 주변 공백과 일치합니다: s/[[:space:]]*;[[:space:]]*
. 이것은 new
단지 a 로 대체됩니다 ;
.
답변2
나는 perl
당신 이 split
할 수 있도록 대답해 드리겠습니다 join
:
#!/usr/bin/env perl
use strict;
use warnings;
while ( <DATA> ) {
chomp;
my @fields = split /;/;
s/\s+//g for @fields;
print join ";", @fields, "\n";
}
__DATA__
03139; 5; IT1234978208; 20150930 ; CTZ 13/31.12.15;
03137; 6; IT1234978206; 20151015 ; CTZ 13/31.11.18;
03134; 8; IT1234974406; 20151212 ; CTZ 13/37.13.17;
이제 필드의 모든 공백을 제거하면 다음이 제공됩니다.
03139;5;IT1234978208;20150930;CTZ13/31.12.15;
03137;6;IT1234978206;20151015;CTZ13/31.11.18;
03134;8;IT1234974406;20151212;CTZ13/37.13.17;
그러나 선행/후행 공백만 제거하려는 경우:
@필드의 경우 s/^\s+|\s+$//g;
이는 한 줄로 줄일 수 있습니다.
perl -F; -lape 's/^\s+|\s+$//g for @F; print join ";", @F;'
어디:
-F;
구분 기호 설정-l
줄 끝 자동 제거/다시 추가를 말합니다.-a
-F
자동 분할입니다(구분 기호 또는 공백의 기본값).-e
"이 조각 실행"입니다.