sed는 \t를 탭으로 구문 분석하지 않습니다.

sed는 \t를 탭으로 구문 분석하지 않습니다.

sed를 사용하여 커피 스크립트에 줄을 삽입하려고 하는데 첫 번째 탭 문자를 무시하는 것 같습니다.

삽입하려는 파일에는 다음 줄이 있습니다.

    karmaServer.start

다음과 같이 행 뒤에 행을 삽입하고 싶습니다.

    karmaServer.start
        flags: ['--no-sandbox']

그래서 나는 작동해야 한다고 생각하는 sed 스크립트를 작성했습니다.

sed "/^\t\tkarmaServer.start/a\t\t\t\tflags: ['--no-sandbox']" build/unit-test.coffee 

그런데 결과가 이상해요. 나는 다음을 얻습니다

    karmaServer.start
t       flags: ['--no-sandbox']

t왜 문자로 줄을 시작하는지, 문자를 제거하는 방법을 이해할 수 없습니다 .

어떤 아이디어가 있나요?

답변1

명령에 줄 바꿈을 추가해야 합니다 sed(그런 다음 이스케이프된 줄 바꿈에 대한 쉘의 처리를 고려해야 합니다).

 sed "/^\t\tkarmaServer.start/a\\
 \t\t\t\tflags: ['--no-sandbox']" build/unit-test.coffee 

GNU sed매뉴얼에 따르면:

ㅏ\

텍스트 포함된 각 줄 바꿈 앞에 백슬래시가 오는 텍스트를 추가합니다.

이것은 매우 명확하지 않으며 이와 같이 형식이 지정되지 않았습니다. (아아, 명령으로 보면 특별히 명확하지 않습니다 man.) 명령의 형식이 a백슬래시, 개행 문자, 그리고 다음으로 구성되어 있다는 것을 알 수 있습니다.텍스트. 즉, 왼쪽 열의 모든 내용입니다.

질문 주석에서 지적했듯이 seds는 잘못된 명령을 처리하는 방법이 다릅니다. Spinellis는 sed필수 백슬래시와 개행 문자 외에 다른 것이 있음을 알리는 오류를 생성합니다.

% sed "/^\t\tkarmaServer.start/a\t\t\t\tflags: ['--no-sandbox']" /dev/null
sed: 1: "/^\t\tkarmaServer.start ...": 명령 끝에서 \ 뒤에 추가 문자
%

귀하의 특별한 선택은 sed나머지 라인을 다음과 같이 취급하는 것 같습니다.텍스트토론. 그러나 첫 번째 백슬래시는 여전히 다음 필수 백슬래시로 간주됩니다 a. 그래서 당신이 끝내는 것은텍스트주장은

t\t\t\tflags: ['--샌드박스 없음']

처음에는 t예상한 것보다 탭이 하나 적습니다.

관련 정보