sed에서 작은 따옴표를 이스케이프하는 방법은 무엇입니까?


92

이미 따옴표로 둘러싸인 sed 표현식에서 작은 따옴표를 이스케이프하는 방법은 무엇입니까?

예를 들면 :

sed 's/ones/one's/' <<< 'ones thing'


1
짧은 대답은 " 당신은 그렇게 할 수 없습니다 "입니다. 제시된 해결 방법은 모두 잘 작동합니다.
glenn jackman

답변:


150

견적 sed따옴표와 코드를 :

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

수백 개의 백 슬래시로 코드를 이스케이프하는 것을 좋아하지 않아 눈이 아파요. 일반적으로 나는 다음과 같은 방식으로 수행합니다.

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

7
이것은 sed -i어떤 특별한 이유 에서 작동하지 않는 것 같습니다 .
SamAko 2016-04-25

sed 명령을 큰 따옴표로 묶으면 해당 명령이 쉘에서 보간 될 수 있으며 예기치 않은 문제가 발생할 수 있습니다.
포통

38

한 가지 트릭은 인접한 문자열의 쉘 문자열 연결을 사용하고 쉘 이스케이프를 사용하여 포함 된 따옴표를 이스케이프하는 것입니다.

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

sed 표현식에는 3 개의 문자열이 있으며 쉘이 함께 꿰맨 다 :

sed 's/ones/two'

\'

's/'

다른 사람에게 도움이되기를 바랍니다!


아마도 쉽게 변형 : 나오지는 'S / 사람 / 두 사람은' '/'<<< '사람 일이
그레고리

@gregory : sed 's/ones/two''s/' <<< 'ones thing'아니요, twos thing. '출력에서 누락되었습니다 . 이 답변에 설명 된 방식으로해야합니다.
wisbucky

@wisbucky 내가 zsh에서 (FreeBSD / macOS)를 사용하고있는 sed 버전을 사용하면 확실히 "두 가지"를 출력합니다.
그레고리

나에게 알려줌으로써 큰 ​​도움이 되십시오.
Prateek Gupta

6

가장 좋은 방법은 $'some string with \' quotes \''

예 :

sed $'s/ones/two\'s/' <<< 'ones thing'

3
C 스타일 $'string'은 Bash 전용이므로 POSIX 셸로 이식 할 수 없습니다.
tripleee

bash구체적 이지 않습니다 . ksh및 에서도 사용할 수 zsh있지만 예, POSIX의 확장이므로 이식 가능한 스크립트를 작성하지 않는 경우 괜찮습니다. 유일한 단점은 사용하는 다른 백 슬래시도 이스케이프해야한다는 것입니다.
dannyw

6

sed 명령 외부에 큰 따옴표를 사용하십시오.

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing

파일에서도 작동합니다.

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing

싱글 문자열 내부에 큰 따옴표를, 그것도 괜찮습니다. 큰 따옴표를 이스케이프하십시오.

예를 들어,이 파일에는 작은 따옴표와 큰 따옴표가 모두 포함 된 문자열이 있습니다. sed를 사용하여 작은 따옴표를 추가하고 일부 큰 따옴표를 제거합니다.

$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
$ cat testfile 
it's more than one's thing

감사! 나는 정규식, 사랑 sed를 사랑하고 지금 나는 당신을 사랑합니다 <3
Gabriel A. Zorrilla

3

이것은 일종의 부조리하지만 내가 얻을 수 \'있는 sed 's/ones/one\'s/'작업에. Angular를 사용 import 'hammerjs';하여 src/main.ts파일에 자동으로 추가되는 쉘 스크립트를 만들기 위해 이것을 찾고있었습니다 .

내가 일하게 된 것은 다음과 같습니다.

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

따라서 위의 예에서는 다음과 같습니다.

apost=\'
sed 's/ones/one'$apost's/'

\'저절로 작동하지 않는지 모르겠지만 거기에 있습니다.



0

나는 이것이 경찰처럼 들릴 것이라는 것을 알고 있지만 문자열에 작은 따옴표와 큰 따옴표가 모두있을 때 sed를 사용할 수 없습니다. 나처럼 문제가있는 초보자를 돕기 위해 한 가지 옵션은 문자열을 분할하는 것입니다. 100 개 이상의 index.hmtl 파일에서 코드를 교체해야했습니다. 문자열에는 작은 따옴표와 큰 따옴표가 모두 있으므로 문자열을 분할하고 첫 번째 블록을 <!--로, 두 번째 블록을 -->. 그것은 내 index.html 파일을 엉망으로 만들었지 만 작동했습니다.


0

AppleMacOSX 터미널의 일부 이스케이프가 실패하므로 다음과 같이됩니다.

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

다른 슬래시와의 혼동을 피하기 위해 ":"와 같은 대체 문자열 구분자를 사용하십시오.

sed "s:ones:one's:" <<< 'ones thing'

또는 작은 따옴표를 강조하려는 경우

sed "s:ones:one\'s:" <<< 'ones thing'

둘 다 반환

one's thing
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.