>

저는 sed 에 대한 POSIX 사양의 영향을 받았습니다. i\ 다음 줄에 텍스트를 왼쪽 정렬해야합니다  출력에서 선행 공백을 원하지 않는 한 명령을 수행하십시오.

BSD에서 BSD sed를 사용한 빠른 테스트는 이것이필요하지 않은것을 보여줍니다

$ cat test.sed 
#!/bin/sed -f
i\
      This line starts with spaces.
$ echo some text | sed -f test.sed
This line starts with spaces.
some text
$

그러나이 문서는 어디에도 없습니다. POSIX 사양이 아니며 sed 에도 없습니다. 내 시스템의 맨 페이지입니다.

sed 에서이 동작에 의존 할 수 있습니까  휴대하고 싶은 스크립트?얼마나 이식성이 좋습니까?

(어딘가에 문서화되어 있습니까?)

<시간>

(Bonus question : sed 를 강제하는 것도 가능합니까?   i\ 에 전달 된 고정 줄의 시작 부분에 공백을 삽입하는 방법 ?)

  • 답변 # 1

    아니오. 그러나 맨 앞 공백을 벗어나면 스크립트를 이식 할 수 있습니다. 왜 ? 어떤 sed 때문에 텍스트 행에서 공백 문자를 제거하고이를 피할 수있는 유일한 방법은 앞 공백을 피하는 것입니다. 지난 세기부터 시작된이 수동 페이지는 다음과 같이 설명합니다. 1, 2, 3
    BSD 도 마찬가지입니다.  와이즈 비즈  (와이즈 와이즈)  방금 코드를 복사했지만 확장자가 아닙니다) 아카이브를 확인하고 sed 를 읽으면   OSX 에서 페이지  꽤 분명합니다 :

    와이즈 비즈 와이즈 비즈  개행을 숨길 수 있습니다. 텍스트의 백 슬래시    man 의 대체 문자열에서 백 슬래시로 처리됩니다.   명령, 초기 공백 및 탭을 보호하는 데 사용될 수 있습니다.   모든 스크립트 행에서 수행되는 스트리핑

    이제 POSIX 사양에 어디에 기록되어 있습니까? 단지

    와이즈 비즈

    그리고RATIONALE아래로 스크롤하면

    와이즈 비즈

    "백 슬래시를 사용할 수 있습니다"부분이 해당 인용 부호에 포함되지 않았으므로 나머지 문구"초기 공백 보호 ..."는 만들지 않습니다. 어떤 의미라도 ...1

    <시간> 어쨌든 요약하자면 일부 구현에서는 텍스트 줄에서 공백을 제거했습니다. 그러나 모든 구현이 준수해야하는 POSIX 사양 때문에

    와이즈 비즈

    삽입 할 텍스트에서 행을 들여 쓰는 이식 가능한 방법은 각 행에서 선행 공백을 이스케이프하는 것입니다.

    <시간>

    1 : 나는 또한 왜 BSD 2.11 를 이해하지 못한다 /

    (1)i\
    text
    .......
    An argument denotedtextconsists of one or more lines, all but the last of which end with  사람들이 '\' 의 전체 단락을 변경했습니다  소스 코드를 변경하지 않고 페이지-이전과 동일한 동작을 수행하지만이 내용을 문서화하는 man 섹션이 더 이상 존재하지 않습니다.

  • 답변 # 2

    OSX 's'  표준 행동이 아닌 확장. 함수

    The argument text shall consist of one or more lines. Each embedded <newline>in the text shall be preceded by a <backslash>. Other <backslash>characters in text shall be removed, and the following character shall be treated literally.

    에서이 링크를 볼 수 있습니다 :

    The requirements for acceptance of <blank>and <space>characters in command lines has been made more explicit than in early proposals to describe clearly the historical practice and to remove confusion about the phrase "protect initial blanks [sic] and tabs from the stripping that is done on every script line" that appears in much of the historical documentation of the sed utility description of text. (Not all implementations are known to have stripped <blank>characters from text lines, although they all have allowed leading <blank>characters preceding the address on a command line.)

    그들은

    Other <backslash>characters in text shall be removed, and the following character shall be treated literally.

    를 사용하여 공간을 먹었습니다.  매크로.

    FreeBSD에서 OSX BSD 를 잘못 취급 할 수있는   man 를 사용할 때 줄 연속 문자로 sed compile_text 행동이 이상하다. 내 FreeBSD 9.3에서 :

    /*
     * Compile the text following an a or i command.
     */
    static char *
    compile_text()
    {
        int asize, size;
        char *text, *p, *op, *s;
        char lbuf[_POSIX2_LINE_MAX + 1];
        asize = 2 * _POSIX2_LINE_MAX + 1;
        text = xmalloc(asize);
        size = 0;
        while (cu_fgets(lbuf, sizeof(lbuf))) {
            op = s = text + size;
            p = lbuf;
            EATSPACE();
            for (; *p; p++) {
                if (*p == '\\')
                    p++;
                *s++ = *p;
            }
            size
    
    

    하지만 :

    EATSPACE
    
    

    일하고 공간도 먹는다.

    GNU sed 가보 \  이 문제는 없습니다.

  • 답변 # 3

    Cuonglm이 가장 좋은 대답을했지만 여기에는GNU a 가 있습니다.  않습니다 :

    i
    
    

    출력 :

    c
    
    
    $ echo 1 | sed -e 'i\ 1' ": extra characters after \ at the end of i command

관련 자료

  • 이전 bash - sudo - /scriptsh를 실행할 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다
  • 다음 awk - 2 문자 분리 문자로 자르기