sed의 "a" 명령을 사용하여 행 접두사를 사용하는 것이 이식 가능합니까?

sed의 "a" 명령을 사용하여 행 접두사를 사용하는 것이 이식 가능합니까?

나는 다음과 같은 흥미로운 동작을 발견했습니다.

$ printf '%s\n' line{1..2} | sed $'1a\\\nPREFIX'
line1
PREFIXline2
$ 

흥미롭게도 이 동작은 다음에만 적용됩니다.마지막명령 뒤에 다른 명령을 배치하려면 줄 바꿈이 필요하기 때문에 Sed 스크립트에서 명령을 사용합니다.

삽입 명령에서도 작동합니다.

$ printf '%s\n' line{1..2} | sed $'1i\\\nPREFIX'
PREFIXline1
line2
$ 

이 동작을 신뢰할 수 있습니까?

어떤 식으로든 언급되는 건 아닌 것 같은데Sed에 대한 POSIX 사양. 단지 text하나 이상의 라인으로 구성될 수 있다고 말합니다 . (줄 바꿈으로 끝나지 않으면 여전히 줄입니까?)

다중 행 삽입에서도 작동합니다.

$ printf '%s\n' line{1..2} | sed $'1a\\\n ****/\n1i\\\n/****\\\n * '
/****
* line1
****/
line2
$ 

답변1

문자열을 줄 접두사로 사용하려면 줄 시작 앵커인 replacement( s) 및 replacement 를 사용하십시오.^

$ printf 'line1\nline2\n' | sed '1s/^/PREFIX/'
PREFIXline1
line2

a행 뒤에 행을 추가하고 i다른 행 앞에 행을 삽입하는 데 사용됩니다 . a및 명령은 i행을 수정하는 데 사용되지 않고 행을 추가하는 데만 사용됩니다.

"이 행동을 믿을 수 있습니까?" Stéphane Chazelas가 주석에서 지적했듯이 "이것은 분명히 버그입니다." GNU는 sed설명된 동작을 표시하지 않습니다.


"줄 바꿈으로 끝나지 않으면 여전히 줄입니까?"라는 질문에 대해POSIX는 "라인"을 다음과 같이 정의합니다.

<newline>0개 이상의 비문자와 종료 문자의 시퀀스입니다 <newline>.

따라서 이 질문에 대한 대답은 "아니요, 선이 아닙니다"입니다.

답변2

방금 다른 Sed로 테스트한 결과 이것이 BSD Sed의 특징이라는 것을 발견했습니다. GNU Sed는 위에 제공된 마지막 명령의 출력에서 ​​가장 잘 설명된 다른 결과를 제공합니다.

$ printf '%s\n' line{1..2} | sed $'1a\\\n ****/\n1i\\\n/****\\\n * '
/****
 *
line1
 ****/
line2
$

관련 정보