2009-07-13 8 views
3

내 Cygwin과 내 Linux 상자 (Debian) 모두 동일한 문제가 발생합니다.쉘 스크립팅. 내 스크립트의 명령 대체 문제

일부 종류의 서식 지정을 사용하는 셸 스크립트에서 작업하고 있는데, 슬래시 발생 (/) 앞에 백 슬래시()가 있습니다.

내 나오지도 스크립트 내 터미널에서 잘 작동 :

# export someid="314-12345/08" 
# echo "${someid}" | sed 's/\//\\\//' 

출력 :

314-12345\/08 

아니지만뿐만 아니라 내가 command substitution 실행하는 경우 :

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'` 
sed: -e expression #1, char 9: unknown option to `s' 

난 무엇을 여기 없습니까?

미리 감사드립니다.

답변

13

/를 sed의 구분 기호로 사용할 의무는 없습니다.

s/a/c/ 

그래서 귀하의 경우

s#a#c# 

될 수 있습니다 :

someidformatted=`echo "${someid}" | sed 's#\/#\\\/#'` 

일을 할 것입니다.

문제가/이스케이프 부족으로 인한 것일뿐입니다.

+0

감사합니다. 이 경우 # 대신 /를 사용하는 것이 명확합니다. – sourcerebels

8

다음은 무슨 일입니까? bash (1) 맨 페이지에서 강조 표시 :

이전 스타일의 대체 인용 형식을 사용할 경우 백 슬래시는 $, '또는 \ 다음에 오는 경우를 제외하고는 문자 그대로의 의미 을 유지합니다. 백 슬래시 앞에없는 첫 번째 역 인용 부호는 명령 대체를 종료합니다. $ (command) 형식을 사용할 때 괄호 사이의 모든 문자가 명령을 구성합니다. 아무도 특별하게 대우받지 않는다.

대개 명령 대체에 백 슬래시가 더 많이 필요할 수 있습니다. 당신은 set -x를 설정하여 디버깅 할 수 있습니다 :

# someidformatted=`echo "${someid}" | sed 's/\//\\\//'` 
++ echo 314-12345/08 
++ sed 's/\//\\//' 
sed: 1: "s/\//\\//": bad flag in substitute command: '/' 
+ someidformatted= 
# someidformatted=$(echo "${someid}" | sed 's/\//\\\//') 
++ echo 314-12345/08 
++ sed 's/\//\\\//' 
+ someidformatted='314-12345\/08' 

그래서, 당신은 \\의 발생이 \에 점등되고 있음을 볼 수 있습니다. 백 슬래시를 더 추가하면 작동하지만, $(command) 양식을 선호합니다.

+0

답장을 보내 주셔서 감사합니다. +1 및 'set -x'를 허용하는 다른 솔루션에 대해서는 +1. – sourcerebels