저는 Linux와 FreeBSD를 모두 사용하는데(특히 Debian Linux와 PC-BSD를 사용합니다) sed
.
"탭으로 구분된 값" 파일을 "쉼표로 구분된 값"으로 변환해야 하는 경우가 많습니다. 내가 아는 가장 간단한 방법은 sed
다음과 같이 를 사용하는 것입니다.
sed 's/\t/,/g' inputFile.txt > outputFile.csv
이것은 Linux에서 완벽하게 작동합니다. 모든 탭을 쉼표로 대체하지만 FreeBSD에서는 아무것도 대체하지 않습니다!
내가 뭐 놓친 거 없니? FreeBSD의 구문은 sed
Linux의 구문과 다릅니까?
답변1
답변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와 달리 sed
FreeBSD는 정규 표현식 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).-i
sed -i -e 's/x/X/g' file
sed
sed
GNU와의 호환성을 높이기 위해 최신 버전의 FreeBSD sed
(FreeBSD 8.1 이상)가 전환되었습니다 .-r
sed
(또한 정규식에서 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