IT박스

sed에서 큰 따옴표와 작은 따옴표를 어떻게 이스케이프합니까?

itboxs 2020. 11. 24. 07:47
반응형

sed에서 큰 따옴표와 작은 따옴표를 어떻게 이스케이프합니까?


내가 찾을 수 있듯이 작은 따옴표를 사용하면 내부의 모든 것이 문자 그대로 간주됩니다. 내 대체품을 원합니다. 하지만 작은 따옴표 나 큰 따옴표가있는 문자열도 찾고 싶습니다.

예를 들면

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g'

"http://www.fubar.com"을 URL_FUBAR로 바꾸고 싶습니다. sed는 내 // 또는 내 큰 따옴표를 어떻게 인식해야합니까?

도움을 주셔서 감사합니다!

편집 : 사용할 수 s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g있습니까?

\ 실제로 작은 따옴표 안의 문자를 이스케이프합니까?


sed명령을 사용하면 다음과 /같이 s명령 에서 구분 기호 대신 다른 문자를 사용할 수 있습니다 .

sed 's#"http://www\.fubar\.com"#URL_FUBAR#g'

또는

sed 's,"http://www\.fubar\.com",URL_FUBAR,g'

큰 따옴표는 문제가되지 않습니다. 작은 따옴표를 일치 시키려면 두 가지 유형의 따옴표를 전환하십시오. 작은 따옴표로 묶인 문자열은 작은 따옴표를 포함 할 수 없습니다 (이스케이프 된 것조차 포함하지 않음).

점을 한 문자와 일치하는 sed정규식 패턴 .아닌 점으로 해석 하려면 점을 이스케이프해야합니다 .


작은 따옴표와 관련하여 문자열 let'slet us다음 으로 바꾸는 데 사용되는 아래 코드를 참조하십시오 .

명령:

echo "hello, let's go"|sed 's/let'"'"'s/let us/g'

결과:

안녕, 가자


작은 따옴표 안에서 작은 따옴표를 이스케이프하기는 어렵습니다. 이 시도:

sed "s@['\"]http://www.\([^.]\+).com['\"]@URL_\U\1@g" 

예:

$ sed "s@['\"]http://www.\([^.]\+\).com['\"]@URL_\U\1@g" <<END
this is "http://www.fubar.com" and 'http://www.example.com' here
END

생산하다

this is URL_FUBAR and URL_EXAMPLE here

내 문제는 ""sed 표현식 자체 내부에 동적 변수가 있기 때문에 표현식 외부 가 필요하다는 것입니다. 그래서 실제 해결책은 "sed 정규식 내부를 [\"].

그래서 내 완전한 bash는 다음과 같습니다.

RELEASE_VERSION="0.6.6"

sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml

여기 있습니다 :

# sed 구분자입니다.

[\"]= "정규식

값 = \"tags/$RELEASE_VERSION\"= 내 대체 문자열, 중요한 것은 \"따옴표에 대해서만 있습니다.


sed에서 큰 따옴표를 이스케이프하는 것은 절대적으로 필요할 수 있습니다. 예를 들어, 전체 sed 표현식에서 큰 따옴표를 사용하는 경우 (셸 변수를 사용하려는 경우에 수행해야 함).

다음은 sed에서 이스케이프를 다루지 만 bash에서 다른 인용 문제를 캡처하는 예제입니다.

# cat inventory
PURCHASED="2014-09-01"
SITE="Atlanta"
LOCATION="Room 154"

반복해서 사용할 수있는 sed 스크립트를 사용하여 방을 변경하고 싶으므로 입력을 다음과 같이 가변 화한다고 가정 해 보겠습니다.

# i="Room 101" (these quotes are there so the variable can contains spaces)

이 스크립트는 전체 행이 없으면 추가하거나 sed를 사용하여 해당 행을 텍스트와 $ i 값으로 대체합니다.

if grep -q LOCATION inventory; then 
## The sed expression is double quoted to allow for variable expansion; 
## the literal quotes are both escaped with \ 
    sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory
## Note the three layers of quotes to get echo to expand the variable
## AND insert the literal quotes
else 
    echo LOCATION='"'$i'"' >> inventory
fi

추신 : 주석을 파싱 할 수 있도록 위의 스크립트를 여러 줄로 작성했지만 다음과 같은 명령 줄에서 한 줄로 사용합니다.

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi

Prompt% cat t1
This is "Unix"
This is "Unix sed"
Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1
Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1
Prompt% cat t1
This is "Linux"
This is "Linux SED"
Prompt%

참고 : BASH 변수를 포함하는 sed 표현식 "은 변수가 올바르게 해석 되도록 큰 따옴표 ( )로 묶어야합니다.

당신은 경우 을 $ BASH 변수 (권장 연습)을 두 번 인용

... 다음과 같이 변수 큰 따옴표를 이스케이프 할 수 있습니다.

sed -i "s/foo/bar ""$VARIABLE""/g" <file>

즉, $ VARIABLE 관련 """.

(전자 -escaping "$VAR"같이 \"$VAR\"A의 결과 "-quoted 출력 문자열).


$ VAR='apples and bananas'
$ echo $VAR
apples and bananas

$ echo "$VAR"
apples and bananas

$ printf 'I like %s!\n' $VAR
I like apples!
I like and!
I like bananas!

$ printf 'I like %s!\n' "$VAR"
I like apples and bananas!

여기에서 $ VAR는 "sed로 파이핑하기 전에 '- "따옴표로 묶습니다 (sed는 -또는- 따옴표로 표시됨).

$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/"$VAR"/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/$VAR/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed 's/""$VAR""/cherries/g'
I like apples and bananas!

$ printf 'I like %s!\n' "$VAR" | sed "s/$VAR/cherries/g"
I like cherries!

$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!

다음과 비교하십시오.

$ printf 'I like %s!\n' $VAR | sed "s/$VAR/cherries/g"
I like apples!
I like and!
I like bananas!


$ printf 'I like %s!\n' $VAR | sed "s/""$VAR""/cherries/g"
I like apples!
I like and!
I like bananas!

... 등등 ...

결론

My recommendation, as standard practice, is to

  • "-quote BASH variables ("$VAR")
  • "-quote, again, those variables (""$VAR"") if they are used in a sed expression (which itself must be "-quoted, not '-quoted)
$ VAR='apples and bananas'

$ echo "$VAR"
apples and bananas

$ printf 'I like %s!\n' "$VAR" | sed "s/""$VAR""/cherries/g"
I like cherries!


You need to use \" for escaping " character (\ escape the following character

sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g'

May be the "\" char, try this one:

sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g'

참고URL : https://stackoverflow.com/questions/7517632/how-do-i-escape-double-and-single-quotes-in-sed

반응형