슬래시를 포함하는 변수를 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
액션은d
delete 명령어) 및
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
'it-source' 카테고리의 다른 글
대소문자를 구분하지 않는 비교 NSString (0) | 2023.04.11 |
---|---|
같은 테이블의 한 열에서 다른 열로 데이터를 복사하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
PowerShell 파일 이름에서 경로 및 확장자를 제거하는 중 (0) | 2023.04.11 |
Git 푸시에는 사용자 이름과 비밀번호가 필요합니다. (0) | 2023.04.11 |
WPF WPF에서 SVG 파일을 아이콘으로 사용하는 올바른 방법은 무엇입니까? (0) | 2023.04.11 |