sed를 사용하여 선행 탭 문자를 4개의 공백으로 바꾸는 방법은 무엇입니까?

sed를 사용하여 선행 탭 문자를 4개의 공백으로 바꾸는 방법은 무엇입니까?

vim에서는 이 작업을 수행할 수 있는 것 같습니다.

:s/^\t\+/\=repeat('    ',len(submatch(0)))

이것이 sed로 어떻게 변환되는지 모르겠습니다. 나는 다음을 시도했다:

sed -ri "s/^\t\+/\=repeat('    ',len(submatch(0)))/g" test.txt

이 명령은 효과가 없는 것 같습니다.

답변1

예를 들면 다음과 같습니다 expand.expand -t 4 file.txt

expand원본 파일은 편집되지 않지만 새 파일로 리디렉션하여 mv원본을 덮어쓰거나, sponge설치된 경우 사용할 수 있습니다.

    expand -t 4 file.txt > file.new && mv file.new file.txt
or 
    expand -t 4 file.txt | sponge file.txt

참고로, unexpand반대로 여러 공백을 탭으로 변환을 참조하세요.

expand둘 다 unexpand고정 너비 탭 문자(예: -t 4또는 -t 8등) 사용을 지원합니다.또는탭 위치 목록(예 -t 4,12,32: ) 또한 초기의 선행 공백/탭만 변환하도록 선택할 수도 있습니다. 자세한 내용은 매뉴얼 페이지를 참조하십시오.


자세한 내용은 다음 을 sponge참조하세요 man sponge.파일을 자체적으로 전송하기 위한 스폰지에 대한 표준 대안이 있습니까?. 즉, 임시 파일을 사용하여 리디렉션과 mv를 수행합니다. 그런데 표준 출력을 현재 표준 입력으로 사용되는 동일한 파일로 리디렉션하지 마십시오. 쉘은 읽기 전에 이를 덮어씁니다.

sponge출신이다더 많은 유틸리티팩.


추신: 또한 참조하십시오GNU 들여쓰기또는 다른 유사한 소스 코드 형식 지정 도구 중 하나입니다.

답변2

$ cat -T /tmp/test.txt
^I^I^I3^I<= this final tab should remain
^I^I2
^I1

sed를 사용하세요:

sed ':loop;s/^\( *\)\t/\1    /;tloop' /tmp/test.txt | cat -T
            3^I<= this final tab should remain
        2
    1

위의 내용은 모든 선행 공백과 선행 탭을 캡처하고 성공하면( ) loop탭을 4개의 공백으로 변환하는 루프(아이러니하게도 레이블이 지정됨)를 설정합니다 . t바라보다https://stackoverflow.com/a/35017207/493161

관련 정보