
Bash 스크립트에서 sed
아포스트로피가 포함된 명령을 사용할 수 있는 방법이 있습니까? 아니면 그렇지 않도록 명령 '
을 변경해야 합니까 ?sed
'
예를 들어, 다음 bash 스크립트를 실행하고 싶습니다.
#!/bin/bash
cat file.txt | sed $'s|^\(some-string\)|\f\\1|'
이 sed
명령은 some-string
inside가 나타날 때마다 개행 문자를 추가해야 합니다. 스크립트가 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
명령의 대체 부분에 s
LF \
가 뒤에 오는 문자를 삽입해야 합니다.
그래서 당신은 다음을 원합니다:
#! /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
. 예, .\n
sed
예를 들어 s를 대체하는 명령과 같이 리터럴을 '
에 전달하려는 경우 전달을 허용하는 셸 인용 연산자를 사용할 수 있습니다. 여기에는 모든 인용 연산자가 포함됩니다.sed
y/'/"/
'
"
'
와는 별개로 '...'
그 자체:
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