이는 매우 간단해야 하지만 어떤 이유로 작동하지 않습니다.
sed -i.bak -E 's/\t/ /' file.txt
탭을 바꾸는 대신 t
문자를 바꿉니다. 인용문 등 제가 생각할 수 있는 모든 변형을 시도했습니다. 구글링해서 찾았어요다른 사람들매우 유사한 표현을 사용하는 것이 그들에게는 효과가 있는 것 같습니다.
이것은 -E
OS X의 문제입니다. 나는 그 실패가 OS X의 이상한 특성 때문일지도 모른다고 생각했기 sed
때문에 Ruby에서도 시도했지만(그렇지 않았습니다 -i
) 같은 결과를 얻었습니다.
ruby -pe '$_.gsub!(/\t/," ")' < file.txt > file.new
나는 OS X와 iTerm에서 Bash 3.2.51을 사용하고 있지만 둘 중 어느 것이 얼마나 중요한지 알 수 없습니다. 이상한 환경 변수 세트는 없지만 관련성이 있다고 생각되는 항목을 게시할 수 있습니다.
무엇이 잘못될 수 있나요?
고쳐 쓰다: Ruby 버전을 시도했을 때 Gilles가 지적했기 때문에 다른 실수나 오타가 있었나 봅니다.하다일하다 (그리고 나는안 돼요그가 나를 오해하게 놔두세요! ). 무슨 일이 일어나고 있는지 잘 모르겠지만 내 실수임에 틀림없다고 확신합니다.
답변1
sed의 탭 문자 구문은 \t
표준이 아닙니다. 그 탈출은GNU sed 확장. 많은 사람들이 GNU sed(비임베디드 Linux의 sed 구현)를 사용하므로 온라인에서 이를 사용하는 많은 예를 찾을 수 있습니다. 하지만OS X sed다른 *BSD sed와 마찬가지로 탭 문자는 지원되지 않으며 대신 백슬래시가 뒤에 오는 것처럼 \t
처리됩니다 .\t
t
다음과 같은 다양한 솔루션이 있습니다.
리터럴 탭을 사용하세요.
sed -i.bak 's/ / /' file.txt
탭 문자를 사용
tr
하거나 생성합니다.printf
sed -i.bak "s/$(printf '\t')/ /" file.txt sed -i.bak "s/$(echo a | tr 'a' '\t')/ /" file.txt
배쉬를 사용하여백슬래시 이스케이프를 허용하는 문자열 구문.
sed -i.bak $'s/\t/ /' file.txt
Perl, Python 또는 Ruby를 사용하십시오. 게시한 Ruby 코드 조각이 작동합니다.
답변2
Bash 전용 사용인용하다C에서와 같이 문자열로 작업할 수 있으므로 이스케이프 시퀀스가 아닌 실제 탭 문자가 sed에 전달됩니다.
sed -i.bak -E $'s/\t/ /' file.txt
답변3
sed -i $'s/\t/ /g' file.txt
OS X에서 작동하며 Linux에서 사용했던 것과 동일한 명령입니다.
답변4
sed
OS X의 기능 (지원 \t
등) 보다 더 많은 기능을 원한다면 다음을 설치하세요.GNU sed.