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

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

저는 Linux와 FreeBSD를 모두 사용하는데(특히 Debian Linux와 PC-BSD를 사용합니다) sed.

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

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

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

내가 뭐 놓친 거 없니? FreeBSD의 구문은 sedLinux의 구문과 다릅니까?

답변1

어쩌면 해당 옵션을 사용해야 할 수도 있습니다 -E(또는 -r설명된 대로).매뉴얼에) GNU Sed와의 호환성을 유지하기 위해. 귀하의 경우에는 Gnu Sed(포트게사르FreeBSD에서는) 그렇지 않으면 스크립트를 포팅하는 데 시간이 오래 걸릴 것입니다.

기억해주세요. BSD의 일부 명령이 유틸리티의 GNU 버전과 다르게 동작한다고 해서 해당 명령이 손상되었다는 의미는 아닙니다.

답변2

네, 다양한 차이점이 있습니다.행동-i내가 아는 유일한 사람입니다.

나는 BSD를 사용해 본 적이 없기 때문에 세부적인 내용에 대해 실제로 도움을 드릴 수는 없지만 해결 방법은 다음을 사용하는 것입니다 tr.

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

기분 좋은 부작용은 속도가 tr훨씬 빨라진다는 것입니다. 저는 한 줄에 2개의 탭이 있고 50000줄이 포함된 테스트 파일을 사용하여 Linux에서 테스트했습니다.

$ 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

답변3

예, GNU와 달리 sedFreeBSD는 정규 표현식 sed과 같은 ANSI C 이스케이프 시퀀스를 해석하지 않습니다 .\t

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

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

스위치나 옵션이 뒤에 오면 sed -i내부 파일 편집 동작이 호환될 수 있습니다(예: GNU 및 FreeBSD).-ised -i -e 's/x/X/g' filesedsed

GNU와의 호환성을 높이기 위해 최신 버전의 FreeBSD sed(FreeBSD 8.1 이상)가 전환되었습니다 .-rsed

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

대체 POSIX 호환 sed구현에 대해서는 다음을 참조하세요.최소화 - 더 작고 저렴하며 빠른 SED 구현.

답변4

로그인하면 다음 공지사항을 보고 저장합니다. 다른 사람들에게도 유용하길 바랍니다

sed(1)를 사용하여 파일을 그 자리에서 편집하고 싶으십니까? "foo"라는 파일에서 모든 "e"를 "o"로 바꾸려면 다음을 수행합니다.

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

"foo.bak"라는 파일에 원본 파일의 백업이 저장되지만, 백업을 원하지 않는 경우:

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

관련 정보