파일 내에서 UNIX 경로 대체량으로 DOS
문제
이런 종류의 경로가 포함 된 파일이 있습니다.
C:\bad\foo.c
C:\good\foo.c
C:\good\bar\foo.c
C:\good\bar\[variable subdir count]\foo.c
다음 파일을 받고 싶습니다.
C:\bad\foo.c
C:/good/foo.c
C:/good/bar/foo.c
C:/good/bar/[variable subdir count]/foo.c
비 매칭 경로를 수정해서는 안됩니다.
고정 된 수의 서브 디어에 대해 SED 로이 작업을 수행하는 방법을 알고 있지만 변수 숫자는 나에게 문제를 일으킨다. 사실, 나는 많은 것을 사용해야 할 것입니다 s/x/y/
표현식 (최대 깊이만큼 ... 그다지 우아하지 않음).
어색 할 수도 있지만 이런 종류의 마술은 내 기술을 넘어서고 있습니다.
참고로 Cygwin 플랫폼에서 일부 GCOV 이진 파일을 수정하려면이 트릭이 필요합니다.
이진 파일을 다루고 있습니다. 따라서 다음과 같은 종류의 데이터가있을 수 있습니다.
bindata\bindata%bindataC:\good\foo.c
다음으로 번역해야합니다.
bindata\bindata%bindataC:/good/foo.c
첫번째 \
같은 줄에도 번역되어서는 안됩니다.
그러나 방금 내 확인했습니다 .gcno
이 텍스트를 편집하는 동안 파일은 모든 경로가 0이있는 것처럼 보이므로 아래의 대부분의 답변은 적합해야합니다.
해결책
sed -e '/^C:\\good/ s/\\/\//g' input_file.txt
다른 팁
나는 당신이 그것을 조사하는 것이 좋습니다 cygpath
경로 이름을 한 형식에서 다른 형식으로 변환하는 유틸리티. 예를 들어 내 기계에서 :
$ cygpath `pwd`
/home/jericson
$ cygpath -w `pwd`
D:\root\home\jericson
$ cygpath -m `pwd`
D:/root/home/jericson
다음은 요청한 내용의 Perl 구현입니다.
$ echo 'C:\bad\foo.c
C:\good\foo.c
C:\good\bar\foo.c
C:\good\bar\[variable subdir count]\foo.c' | perl -pe 's|\\|/|g if /good/'
C:\bad\foo.c
C:/good/foo.c
C:/good/bar/foo.c
C:/good/bar/[variable subdir count]/foo.c
문자열과 직접 작동하므로 어디서나 작동합니다. 당신은 그것을 결합 할 수 있습니다 cygpath
, 그러나 그것은 그 경로가있는 기계에서만 작동합니다.
perl -pe '$_ = `cygpath -m $_` if /good/'
(내 컴퓨터에 C : 좋은 것이 없으므로 C:goodfoo.c
. 컴퓨터에서 실제 경로를 사용하는 경우 올바르게 작동해야합니다.)
당신은 대체하고 싶습니다 '/
' 모든 '\
'그러나 좋은 디렉토리 경로와 일치하는 선에만. SED와 AWK는 모두 올바른 경로로 선을 선택하는 LHS (일치하는) 표현식을 통해이 작업을 수행 할 수 있습니다.
이 작업을 수행하는 사소한 SED 스크립트는 다음과 같습니다.
/[Cc]:\\good/ s/\\/\//g
파일의 경우 :
c:\bad\foo
c:\bad\foo\bar
c:\good\foo
c:\good\foo\bar
아래에서 출력을 얻을 수 있습니다.
c:\bad\foo
c:\bad\foo\bar
c:/good/foo
c:/good/foo/bar
다음은 awk에서 어떻게 할 것인지는 다음과 같습니다.
# fixpaths.awk
/C:\\good/ {
gsub(/\\/,"/",$1);
print $1 >> outfile;
}
그런 다음 명령을 사용하여 실행합니다.
awk -f fixpaths.awk paths.txt; mv outfile paths.txt
또는 좋은 ol 'bash의 도움으로 :
#!/bin/bash
cat file | while read LINE
do
if <bad_condition>
then
echo "$LINE" >> newfile
else
echo "$LINE" | sed -e "s/\\/\//g" >> newfile
fi
done
이 시도
sed -re '/\\good\\/ s/\\/\//g' temp.txt
아니면 이거
awk -F"\\" '{if($2=="good"){OFS="\/"; $1=$1;} print $0}' temp.txt