나는 다음과 같은 흥미로운 동작을 발견했습니다.
$ 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
$