*nix 명령과 함께 사용하기 위해 DOS 파일 이름 이스케이프 처리

StackOverflow https://stackoverflow.com/questions/35286

  •  09-06-2019
  •  | 
  •  

문제

sed와 함께 사용할 수 있도록 DOS 파일 이름을 이스케이프하고 싶습니다.다음과 같은 DOS 배치 파일이 있습니다.

set FILENAME=%~f1

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

(메모: %~f1 - 확장 %1 정규화된 경로 이름으로 - C:\utils\MyFile.txt)

나는 백 슬래시가 %FILENAME% 다음 문자를 탈출하고 있습니다.

이스케이프되도록 어떻게 두 배로 늘릴 수 있습니까?

(저는 cygwin을 설치했으므로 다른 *nix 명령을 자유롭게 사용해도 됩니다)

해결책

Jeremy와 Alexandru Nedelcu의 제안을 결합하고 사용 | 내가 가진 SED 명령의 구분기를 위해

set FILENAME=%~f1
cygpath "s|Some Pattern|%FILENAME%|" >sedcmd.tmp
sed -f sedcmd.tmp inputfile
del /q sedcmd.tmp
도움이 되었습니까?

해결책

이것은 작동합니다.BAT 파일에서는 유닉스에서처럼 set var=`cmd`를 사용할 수 없기 때문에 지저분합니다.echo가 따옴표를 이해하지 못한다는 사실도 지저분하며, 다음과 같은 경우 문제가 발생할 수 있습니다. 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

[편집됨]:나는 그것이 당신에게 효과가 없다는 것에 놀랐습니다.방금 테스트했는데 내 컴퓨터에서 작동했습니다.나는 sed를 사용하고 있습니다 http://sourceforge.net/projects/unxutils cmd.exe를 사용하여 bat 파일에서 해당 명령을 실행합니다.

다른 팁

대안으로 시도해 볼 수도 있습니다(명령 프롬프트에서)...

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

짐작할 수 있듯이 백슬래시를 슬래시로 변환합니다.

@Alexandru & Jeremy, 도움을 주셔서 감사합니다.둘 다 찬성표를 얻습니다

@제레미

귀하의 방법을 사용하면 다음과 같은 오류가 발생했습니다.

sed:-e 표현식 #1, 문자 8:종료되지 않은 `s' 명령

답변이 작동하도록 답변을 편집할 수 있다면 수락하겠습니다.(내 솔루션을 붙여넣는 것은 포함되지 않습니다)

업데이트: 좋아, UnixUtils로 시도해 보았는데 효과가 있었습니다.(참고로 제가 다운로드한 UnixUtils의 날짜는 2007년 3월 1일이며 GNU sed 버전 3.02를 사용합니다. Cygwin 설치에는 GNU sed 버전 4.1.5가 있습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top