문제

이런 종류의 경로가 포함 된 파일이 있습니다.

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

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