sed는 FreeBSD와 Linux에서 다르게 동작합니까?


12

나는 리눅스와 FreeBSD를 사용하고 (특히 데비안 리눅스와 PC-BSD를 사용한다) 이상한 점을 발견했다 sed.

"탭으로 구분 된 값"파일을 "쉼표로 구분 된 값"으로 자주 변환해야합니다. 내가 아는 가장 간단한 방법은 sed다음과 같이 사용하는 것입니다.

sed 's/\t/,/g' inputFile.txt > outputFile.csv

이것은 리눅스에서 완벽하게 작동합니다 : 모든 탭을 쉼표로 대체하지만 FreeBSD에서는 아무것도 대체하지 않습니다!

뭔가 빠졌습니까? sedLinux의 FreeBSD와 다른 구문이 있습니까?

답변:


9

GNU Sed와의 호환성을 유지 하려면 -E옵션을 사용 하거나 설명서에-r 설명 대로 사용해야합니다 . 귀하의 경우, Gnu Sed에 익숙하다면 ( FreeBSD에서 포트 gsed ) Gnu Sed를 설치 하거나 스크립트를 포팅하는 데 오랜 시간이 걸립니다.

그리고 기억하십시오. BSD의 일부 명령이 해당 유틸리티의 gnu 버전과 같이 작동하지 않는다고해서 고장난 것은 아닙니다.)


1
감사합니다. 이 -E옵션은 트릭을 만듭니다 (FreeBSD 및 Mac OS X 모두).
Barranka

내 FreeBSD 9에서 -E 옵션이 도움이되지 않습니다.
Ark-kun

6

그렇습니다. 다양한 차이점이 있습니다 . 제 머리 꼭대기에서 내가 아는 유일한 행동입니다-i .

나는 BSD를 사용한 적이 없으므로 세부 사항을 실제로 도울 수는 없지만 해결 방법은 tr대신 사용할 수 있습니다 .

tr '\t' , < inputFile.txt > outputFile.csv

유쾌한 부작용은 tr훨씬 빠릅니다. Linux에서 50000 줄의 테스트 파일을 사용하여 테스트했으며 각 탭에는 2 개의 탭이 있습니다.

$ time tr '\t' , < foo.txt > /dev/null 

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time sed 's/\t/,/g' foo.txt > /dev/null 

real    0m0.039s
user    0m0.036s
sys     0m0.000s

tr '\t' ,보다 휴대가 편리 tr $'\t' ,합니다. tr '[\t]' '[,]'일부 구형 SysV 시스템에도 이식 가능합니다.
Stéphane Chazelas

탭은 기본 구분 기호입니다 cut. POSIX 사양 tr있습니다 . [오래된 SysV 에 필요한 것이 잘못되었습니다 . POSIX 사양 [은 범위에 대해서만 필요합니다.
Stéphane Chazelas

@StephaneChazelas이므로 혼란 스럽습니다. 어쨌든 설명을 주셔서 감사합니다.
terdon

4

예, GNU sedFreeBSD 와 달리 sedANSI C 이스케이프 시퀀스 (예 : \t정규식) 는 해석하지 않습니다 .

이 경우 최소 공통 분모를 얻는 한 가지 방법은을 사용하는 것 printf입니다.

tab="$(printf '\t')"
printf '\t\n' | sed 's/'"${tab}"'/,/g'
printf '\t\n' | sed 's/'"$(printf '\t')"'/,/g'

sed -i전체 파일 편집 동작은 스위치 나 옵션이 -i스위치 바로 다음에 오는 경우 호환 가능합니다. 예를 들어 sed -i -e 's/x/X/g' fileGNU sed와 FreeBSD 모두에서 작동합니다 sed.

최신 버전의 FreeBSD sed(FreeBSD 8.1 이상)는 -rGNU와의 호환성을 높이는 스위치를 가지고 있습니다 sed.

또한 sed정규식 에 POSIX 문자 클래스 를 사용하는 것도 호환성을 보장하는 좋은 방법입니다.

대안으로 POSIX 준수 sed구현은 다음을 참조하십시오. 소형화,보다 저렴하고 빠른 SED 구현 .


3

다음 TAB대신 리터럴 문자를 사용해야합니다 \t.

sed 's/    /,/g' inputFile.txt > outputFile.csv

다른 질문에 대한 Stephane의 의견 을 참조하십시오 .

다음 기사도 관심을 가질 수 있습니다.

관련 부분을 인용합니다.



정규 표현식의 차이점 정규 표현식 구문은 SED 버전에 따라 미묘하게 다릅니다. 대부분의 차이점은 ASCI 벨 및 용지 공급과 같이 인쇄되지 않는 문자를 일치시키는 데 사용되는 특수 이스케이프 패턴과 관련됩니다.


0

로그인 후 다음 알림을보고 저장합니다. 그것이 다른 사람들에게도 도움이되기를 바랍니다.

sed (1)를 사용하여 파일을 편집하고 싶습니까? 'foo'라는 파일에서 모든 'e'를 'o'로 바꾸려면 다음을 수행하십시오.

sed -i.bak s/e/o/g foo

그리고 'foo.bak'라는 파일로 원본의 백업을 얻을 수 있지만 백업을 원하지 않는 경우 :

sed -i '' s/e/o/g foo

-i옵션이되었다 이미 덮여 있지만,
제프 쉘러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.