it-source

슬래시를 포함하는 변수를 sed에 전달하는 방법

criticalcode 2023. 4. 11. 22:06
반응형

슬래시를 포함하는 변수를 sed에 전달하는 방법

슬래시를 포함하는 변수를 패턴으로 전달하려면 어떻게 해야 합니까?sed?

예를 들어 다음과 같은 변수가 있는 경우:

var="/Users/Documents/name/file"

넘겨주고 싶다sed다음과 같이 합니다.

sed "s/$var/replace/g" "$file"

하지만 오류가 발생합니다.어떻게 하면 이 문제를 피할 수 있을까요?

대체 regex 구분 기호를 다음과 같이 사용합니다.sed그럼 임의의 딜리미터(제어 문자 포함)를 사용할 수 있습니다.

sed "s~$var~replace~g" $file

위에서 설명한 바와 같이 다음과 같이 제어 문자를 딜리미터로 사용할 수 있습니다.

sed "s^[$var^[replace^[g" file

어디에^[를 함께 누르면 입력됩니다.

그렇지 않으면bash셸 이 기능을 사용할 수 있습니다.sed와 함께\03구분 기호:

d=$'\03'
sed "s${d}$var${d}replace$d" file

순수한 bash 답변: 파라미터 확장을 사용하여 변수 내의 슬래시를 모두 백슬래시 이스케이프합니다.

var="/Users/Documents/name/file"
sed "s/${var//\//\\/}/replace/g" $file

다른 방법은 anubhava의 대답보다 못생겼지만 모든 백슬래시를 탈출하는 것입니다.var다른 것을 사용하다sed명령어:

var=$(echo "$var" | sed 's/\//\\\//g')

그러면 다음과 같이 동작합니다.

sed "s/$var/replace/g" $file

사용./sed는 딜리미터로 치환되면 변수의 슬래시와 경합하고 결과적으로 오류가 발생합니다.이를 회피하는 한 가지 방법은 해당 변수에 포함된 모든 문자와 고유한 다른 딜리미터를 사용하는 것입니다.

var="/Users/Documents/name/file"

상황에 맞는 옥토소프 문자(또는 다른 문자)를 사용할 수 있습니다./사용하기 쉽도록)

sed "s#$var#replace#g" 

또는

sed 's#$'$var'#replace#g'

변수에 공백이 없는 경우에 적합합니다.

또는

sed 's#$"'$var'"#replace#g'

셸이 셸에 특수 셸 문자로 간주될 수 있는 문자를 삽입할 수 있는 명령어 전체를 이중 따옴표로 묶는 것보다 변수 내의 모든 것을 대체하는 데만 관심이 있기 때문에 위의 방법을 사용하는 것이 현명합니다.

이것은 오래된 질문입니다만, 이 회답의 어느 것에도, 운용에 관한 것은 없습니다.s/from/to/아주 상세하게

의 일반적인 형태sed스테이트먼트는

*address* *action*

여기서 address는 regex 범위 또는 회선 번호 범위(또는 공백)를 지정할 수 있습니다.이 경우 액션은 모든 입력 회선에 적용됩니다.예를 들면

sed '1,4d' file

1 ~ 4 의 회선을 삭제합니다(주소는 회선 번호의 범위입니다).1,4액션은ddelete 명령어) 및

sed '/ick/,$s/foo/bar/' file

첫 번째 발생을 대체하다foo와 함께bar정규식의 첫 번째 일치 사이의 임의의 행에ick파일의 말미(주소는,/ick/,$액션은s 명령어 " " " "s/foo/bar/를 참조해 주세요.

문맥에서 " "가"의 경우,ick온 으로, 할 수 있습니다.

sed "/$variable/,\$s/foo/bar/"

(단일 따옴표 대신 큰따옴표 사용으로 셸이 변수를 보간할 수 있고 큰따옴표 안에 리터럴 달러 기호를 따옴표로 묶을 필요가 있음) 단, 변수에 슬래시가 포함되어 있으면 구문 오류가 발생합니다(셸은 변수를 확장하고 결과 문자열을 에 전달합니다).sed; 그래서sed는 리터럴 텍스트만 표시되며 셸 변수의 개념은 없습니다.)

은 다른 값에서할 수 할 수 하는 경우)를하는데, 이 .s%foo%bar% 딜리미터를 합니다./:

sed "\\%$variable%,\$s/foo/bar/" file

(단일 따옴표, 단일 백슬래시로 충분합니다).또는 값의 모든 슬래시를 개별적으로 이스케이프할 수 있습니다.다음 구문은 Bash 전용입니다.

sed "/${variable//\//\\/}/,\$s/foo/bar/" file

또는 다른 셸을 사용하는 경우

escaped=$(echo "$variable" | sed 's%/%\\/%g')
sed "s/$escaped/,\$s/foo/bar/" file

쉽게 하기 위해서, 「」의 경우.$variable " " " 가 되어 있습니다.1/2는 '먹다'에됩니다.

sed '\%1/2%,$s/foo/bar/' file

첫 번째 경우, 그리고

sed '/1\/2/,$s/foo/bar/' file

두 번째에.

Perl을 사용합니다.여기서 변수는 매크로 확장뿐만 아니라 퍼스트 클래스 시민입니다.

var=/Users/Documents/name/file perl -pe 's/\Q$ENV{var}/replace/g' $file
  • -p을 한 후 합니다.
  • \Q합니다(여기서 없습니다.단, 이 이 포함되었을 경우 합니다).[또는 정기적인 조사에 대해 특별한 다른 값)

줄 수 있다sed임의의 문자를 구분자로 사용하여 임의의 문자를 딜리미터로 사용합니다.를 들어, 문자 「」를 붙이면, 「」는 「」입니다.# as ~하듯이sed's delimiter, you can replace 의 딜리미터, 치환할 수 있습니다.cat with 와 함께dog그런대로 괜찮아요.다음과 같이 합니다.

sed -i s#cat#dog#g test.txt

변수를 사용하는 경우

sed -i s#$var#replace#g $file

언급URL : https://stackoverflow.com/questions/27787536/how-to-pass-a-variable-containing-slashes-to-sed

반응형