2008-08-29 4 views
3

DOS 파일 이름을 이스케이프 처리하여 sed와 함께 사용할 수 있습니다. 나는이 같은 DOS 배치 파일에 뭔가를 :DOS 파일 이름이 * nix 명령과 함께 사용하기 위해 이스케이프 처리됩니다.

set FILENAME=%~f1 

sed 's/Some Pattern/%FILENAME%/' inputfile 

(참고 : %~f1을 - C:\utils\MyFile.txt - 완전한 경로 이름에 %1을 확장)

내가 %FILENAME%에서 백 슬래시 바로 다음 문자를 탈출하는 것을 발견 .

어떻게 그들을 두 번 이스케이프되도록 이중화 할 수 있습니까?

솔루션

제레미와 Alexandru Nedelcu의 제안을 결합하고, 사용 (내가 Cygwin에서 너무 다른 유닉스 계열의 명령어를 사용하여 주시기 설치) | 나는 sed 명령에서 구분 기호에 대해 가지고있다

답변

2

이것은 작동 할 것이다. BAT 파일에서는 unix 에서처럼 set var =`cmd`를 사용할 수 없기 때문에 지저분합니다. 에코가 따옴표를 이해하지 못한다는 사실 또한 지저분한 것이며 Some Pattern에 셸 메타 문자가 포함되어 있으면 문제가 발생할 수 있습니다.

set FILENAME=%~f1 
echo s/Some Pattern/%FILENAME%/ | sed -e "s/\\/\\\\/g" >sedcmd.tmp 
sed -f sedcmd.tmp inputfile 
del /q sedcmd.tmp 

은 [편집] : 나는 당신을 위해 작동하지 않았다 놀라게하고있다. 방금 테스트했는데 내 컴퓨터에서 작동했습니다. http://sourceforge.net/projects/unxutils에서 sed를 사용하고 cmd.exe를 사용하여 해당 명령을 bat 파일에서 실행합니다. 당신이 추측 수 있듯이

2

당신은 (명령 프롬프트에서) 같은 대체 시도해 볼 수도 있습니다 ...

> cygpath -m c:\some\path 
c:/some/path 

, 그것은 슬래시에 백 슬래시를 변환합니다.

0

@Alexandru & 제레미, 도와 줘서 고마워. 당신이 내가 그것을 받아 들일 것 작동하도록 답변을 편집 할 수있는 경우

sed: -e expression #1, char 8: unterminated `s' command

: 당신 둘은 upvotes

@Jeremy

나는 다음과 같은 오류를 가지고 당신의 방법을 사용하여 얻을. (내 솔루션을 붙여 넣는 것은 포함되지 않습니다)

업데이트 : 좋아, 나는 그것을 UnixUtils로 시도해 보았다. (참고로, 내가 다운로드 한 UnixUtils는 2007 년 3 월 1 일자로 GNU sed 버전 3.02를 사용하고, Cygwin 설치는 GNU sed 버전 4.1.5를 사용합니다)

관련 문제