2013-12-20 6 views
0

쉘 변수로 sed replace를 구현하려고합니다. 나는 등을 괄호에 문제가 계속 "를 사용하려고 시도하는 동안 지금까지 지금은 나오지 작업하면서이 대답 https://stackoverflow.com/a/5156322/675100Sed가 쉘 변수로 바꾸기

에 명시된 것과 같이 쉘 변수를 확장하지 않습니다 '

sed -i -r 's#(export\ PATH=")(.*)#\1/home/USER/bin:~/.local/bin:\2#' ~/.zshrc 

그러나 불행하게도 '로 교체 첫 번째 시도가 될 것이다 나는 항상 대신 USER

whoami을 사용하려면이 제네릭하고 싶다

sed -i -r "s#\(export\ PATH=\"\)(.*)#\1/home/`whoami`/bin:~/.local/bin:\2#" ~/.zshrc 
sed: -e expression #1, char 60: invalid reference \2 on `s' command's RHS 

편집

나는 두 번째 그룹을 탈출

sed -i -r "s#\(export\ PATH=\"\)\(.*\)#\1/home/$(whoami)/bin:~/.local/bin:\2#" ~/.zshrc 

을 시도했지만 나는 유사한 오류 얻을 : 문제가 -r 플래그를했다 그래서

sed: -e expression #1, char 63: invalid reference \2 on `s' command's RHS 
+0

참고 만'$' 그리고 back-tick은 큰 따옴표 안에 문제를 일으킨다. 괄호는'$ (whoami)'와 같이'$'이 붙은 경우에만 관련이 있습니다. –

+0

'(. *)'주위에 두 번째 쌍이 아닌 첫 번째 괄호 쌍을 이스케이프 처리했습니다. 그래서 '\ 2'로 참조 할 수있는 두 번째 그룹이 없습니다. 또한,'-r'은 무엇을위한 것인가? 'sed'의 사본에는 그 중 하나가 없습니다 ... – svckr

+0

왜'~/bin' 대신에'/ home/USER/bin'을 특별히 사용하고 있습니까? –

답변

3

당신은 다음과 같이 쓸 수

sed -i 's#export PATH="#&~/bin:~/.local/bin:#' ~/.zshrc 

주의한다 :

    대신 (시작) 일치의
  • (끝) 및 like (start) "newstuff"(end) 사이에 삽입하고, 그냥 일치시킬 수 있습니다 (start). &을 사용하여 자체와 바꾸고 "new 다음은 동일하기 때문에 물건 "
  • , 당신은 단일 인용 부분 언제든지 종료하고 나중에 새로운 단일 인용 부분을 시작할 수 있으며, 인용을 단순화하기 위해 :

    echo 'hello there' 
    echo 'hello'' there' 
    
0

확인을 확장 정규 표현식을 사용했습니다.

최종 솔루션을 사용하는 것이 었습니다 : 당신은 모든 백 슬래시를 탈출해야하므로

sed -i "s#\(export\ PATH=\"\)\(.*\)#\1/home/$(whoami)/bin:~/\.local/bin:\2#" ~/.zshrc 
1

백 슬래시 이스케이프는 큰 따옴표 문자열 내에서 미리 형성되어있다!

sed -i -r "s#\\(export PATH=\"\\)\\(.*\\)#\\1/home/$(whoami)/bin:~/.local/bin:\\2#" ~/.zshrc 

다음 중 하나를 사용하여 사용자의 집 주소를 결정합니다.

sed -i -r "s#\\(export PATH=\"\\)\\(.*\\)#\1~/bin:~/.local/bin:\\2#" ~/.zshrc 
sed -i -r "s#\\(export PATH=\"\\)\\(.*\\)#\1$HOME/bin:~/.local/bin:\\2#" ~/.zshrc 
sed -i -r "s#\\(export PATH=\"\\)\\(.*\\)#\1$(getent passwd $LOGNAME | cut -d: -f6)/bin:~/.local/bin:\\2#" ~/.zshrc 

전체 접근 방식이 약해 보입니다.

  • PATH가 이미 내 보낸 이후로 PATH="..."을 사용하면 어떻게 될까요?
  • 작은 따옴표를 사용하면 어떻게됩니까?
  • 다른 도트 파일을 사용하면 어떻게됩니까?

왜 그냥

PATH="~/bin:~/.local/bin:$PATH" 

사용하지 않는 ??

sed -i 's#export PATH="#&/home/'$(whoami)'/bin:~/.local/bin:#' ~/.zshrc 

또는 @glennjackman로 지적 :