2016-12-30 3 views
1

cook.sh 스크립트에 두 개의 sed 명령이 있습니다. 하나의 명령은Sed가 일반적인 방식으로 작동하지 않습니다. 쉘 스크립팅

sed -E -i "s/^(\\\$mainDomain=\")[^\"]+(\";)$/\1$MainDomain\2/" /var/config.php 

입니다.

그러나 아래 명령은 거의 같습니다. 하지만 작동하지 않습니다. 아래의 오류 메시지가 줄

sed -E -i "s/^(\\\$authURI=\")[^\"]+(\";)$/\1$duo_auth\2/" /var/config.php 

나오지 : -e 표현 # 1, 문자 36 : '의'

이에 어떤 생각을 알 수없는 옵션?

+0

두 번째 명령이 작동하지 않는 샘플 파일을 제공합니다. OK이고 변수'$ duo_auth'의 값이 – Inian

+0

입니다. 이스케이프 처리되지 않은'/'가 포함 된'$ duo_auth' 일 것입니다. 왜'-i'를 사용합니까? 테스트한다면, 확실한 실수 방법입니다. – Kusalananda

+0

@Kusalananda는 사실에 감사드립니다. 이것에 대한 해결책을 제게 줄 수 있습니까? 샘플 예제가 있습니다. 나는이 sed 명령에 대해 완전히 새로운 것이다. – Daz

답변

2

문제로 인해 교체 변수 $duo_auth 가능성이 갖는 않은 이스케이프

sed -E -i "s~^(\\\$authURI=\")[^\"]+(\";)$~\1$duo_auth\2~" /var/config.php 

~/에서 기본 sed 구분을 변경, /을 예상대로 교체 인 경우보고를 위해 -i없이 시도 확인 후 다시 돌려 놓으십시오.

예 : - 이제 변수 이제

duo_auth="http://auth.uri.digin.io:3048/" 

교체를 설정

cat /var/config.php 
<?php 
$authURI="dev.digin.io"; 

, -i

sed -E "s~^(\\\$authURI=\")[^\"]+(\";)$~\1$duo_auth\2~" /var/config.php 
<?php 
$authURI="http://auth.uri.digin.io:3048/"; 
+0

완벽하게 작동합니다! 감사합니다 @Inian – Daz

0

없이 문제는 아마 인해 $duo_auth 포함에 unes입니다 caped /. 즉, sed 편집 스크립트에는 구문 오류가 있습니다.

sed "s#....#....#" 

그냥 당신이 이제까지 중 하나 $duo_auth에 설정하지 않을 문자를 선택하는 것이 있는지 확인하십시오

당신은 예를 #를 들어, s/.../.../ 명령의 구분 기호로 사용하는 다른 문자를 선택할 수 있습니다 또는 $authURI

테스트 중에는 인디 아트 편집 (-i)을 sed과 함께 사용하지 않는 것이 좋습니다. 또한 -i 스위치는 sed 구현 사이에서 끔찍하게 휴대 할 수 없습니다 (일부는 인수가 필요함). 테스트를 옮기기 전에 data.in.tmp 파일을 확인하는 동안

대신,

sed -e "s#...#...#" data.in >data.in.tmp && mv -f data.in.tmp data.in 

약간 더 성가신을한다.

+0

어떤 이유에서'@'de-limiter가 같은 오류를 일으키고 있습니다.'~'에 대한 존경심이 좋고,'@'역시 메타 문자가 아닙니다! 이상한! – Inian

+0

@Inian'$ duo_auth'는 우연히'@'를 포함합니까? 그렇다면, 같은 방법으로 실패 할 것입니다. – Kusalananda

+0

아니, 그것없이 그것을 테스트했습니다. – Inian