간단한 sed 탭 교체가 이상하게 실패함

간단한 sed 탭 교체가 이상하게 실패함

이는 매우 간단해야 하지만 어떤 이유로 작동하지 않습니다.

sed -i.bak -E 's/\t/  /' file.txt

탭을 바꾸는 대신 t문자를 바꿉니다. 인용문 등 제가 생각할 수 있는 모든 변형을 시도했습니다. 구글링해서 찾았어요다른 사람들매우 유사한 표현을 사용하는 것이 그들에게는 효과가 있는 것 같습니다.

이것은 -EOS 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처리됩니다 .\tt

다음과 같은 다양한 솔루션이 있습니다.

  • 리터럴 탭을 사용하세요.

    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

sedOS X의 기능 (지원 \t등) 보다 더 많은 기능을 원한다면 다음을 설치하세요.GNU sed.

관련 정보