Bash 스크립트의 sed: 알 수 없는 명령: `''`

Bash 스크립트의 sed: 알 수 없는 명령: `''`

Bash 스크립트에서 sed아포스트로피가 포함된 명령을 사용할 수 있는 방법이 있습니까? 아니면 그렇지 않도록 명령 '을 변경해야 합니까 ?sed'

예를 들어, 다음 bash 스크립트를 실행하고 싶습니다.

#!/bin/bash

cat file.txt | sed $'s|^\(some-string\)|\f\\1|'

sed명령은 some-stringinside가 나타날 때마다 개행 문자를 추가해야 합니다. 스크립트가 cat 명령만 실행하는 것처럼 보이기 때문에 이는 작동하지 않습니다.

"또한 명령 주위에 따옴표를 추가해 보았습니다 sed.

cat file.txt | sed "$'s|^\(some-string\)|\f\\1|'"

오류를 반환합니다:

sed: -e expression #1, char 2: unknown command: `''`

.sh script.sh

답변1

$'...'C 문자열 의 경우 \f이는 폼 피드 문자(FF, ^L)입니다. 개행 문자는 \n개행 문자(LF, ^J)입니다. 표준에서는 sed명령의 대체 부분에 sLF \가 뒤에 오는 문자를 삽입해야 합니다.

그래서 당신은 다음을 원합니다:

#! /bin/sh -
< file.txt sed '
  s|^some-string|\
&|'

그리고 $'...':

#! /bin/bash -
< file.txt sed $'s|^some-string|\\\n&|'

GNU 구현을 사용하면 개행 문자/LF를 나타내기 위해 대체를 사용할 sed수도 있습니다 .\n

#! /bin/sh -
< file.txt gnu-sed 's|^some-string|\n&|'

어떤 경우에도 sed이 명령에는 아포스트로피가 전달되지 않습니다. '...'$'...'셸의 인용 연산자입니다. 첫 번째(표준)는 내부 콘텐츠를 그대로 에 전달하는 데 사용되고 sed, 두 번째(ksh93 확장은 이제 를 포함한 일부 다른 셸에서 지원됨 bash) 에 전달하기 전에 그 안의 시퀀스를 확장하는 데 사용됩니다 \f. 예, .\nsed

예를 들어 s를 대체하는 명령과 같이 리터럴을 '에 전달하려는 경우 전달을 허용하는 셸 인용 연산자를 사용할 수 있습니다. 여기에는 모든 인용 연산자가 포함됩니다.sedy/'/"/'"'와는 별개로 '...'그 자체:

sed $'y/\'/"/'  # $'...' quoting operator
sed "y/'/\"/"   # "..." quoting operator
sed y/\'/\"/    # \x quoting operator

답변2

Posixly sed가 이를 달성하는 방법은 다음과 같습니다.

$ sed -e '/^some_string/!b'  - e 'H;s/.*//;x' filename 

관련 정보