sed 명령이 "sed : 대체 식의 잘못된 옵션"을 반환 함


0

예를 들면 :-file.txt라는 파일이 있습니다.

$ cat file.txt
$key

텍스트 파일에 $ key와 같은 환경 변수가 있습니다.

$ key = 1234라고 말하면 값을 아래 명령으로 바꿀 수 있습니다

sed -i 's/$key/'"$key"'/' file.txt 

그리고 그것은

$ cat file.txt
1234

내 문제는

$key = 1/2/3/4

아래 명령을 실행할 수 없습니다

sed -i 's/$key/'"$key"'/' file.txt  

오류가 발생합니다

sed: bad option in substitution expression

슬래시 때문에 깨졌습니다. 직접 값을 제공하여 해결할 수는 있지만 그런 식으로 사용하고 싶지 않습니다.

sed -i 's/$key/1\/2\/3\/4/' file.txt 

답변:


5

문제는 sed구분자가 /있고의 텍스트와 충돌 한다는 사실 과 관련이 $key있습니다. 이를 해결하려면 다른 구분 기호를 사용하십시오. 예를 들면 다음과 #같습니다.

$ key="1/2/3/4"
$ echo 1/2/3/4 | sed "s#$key#\"$key\"#" 
"1/2/3/4"

또는

$ echo "hello this is 1/2/3/4 yeah" | sed "s#$key#\"$key\"#"
hello this is "1/2/3/4" yeah

재미있는 독서 : sed에서 어떤 구분자를 사용할 수 있습니까? . 스포일러 : 거의 모든 것!


문제는 변수에 어떤 문자가 포함 될지 모르는 경우입니다.
choroba

1

구조에 펄 :

perl -pe 's/\$([[:alnum:]]+)/$ENV{$1}/'

설명:

  • \$ 달러 기호와 일치합니다.
  • [[:alnum:]]숫자, 문자 및 밑줄 (예 : 유효한 식별자 문자)과 일치합니다. +수단은 적어도 하나 개의 문자가 있어야합니다.
  • (...) 캡처 그룹을 소개합니다.
  • $ENV{$1}%ENV환경 변수가 포함 된 해시 에서 값을 검색합니다 . 펄은 쉘과 같은 변수를 확장하지 않으므로 변수는 /해를 끼치 지 않고 포함 할 수 있습니다 .

예:

$ echo '$key' | key=1/2/3/4 perl -pe 's/\$([[:alnum:]]*)/$ENV{$1}/'
1/2/3/4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.