4

この種のパスを含むファイルがあります。

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すべてのパスがゼロで囲まれているように見えるため、以下の回答のほとんどが適合するはずです。

4

6 に答える 6

5
sed -e '/^C:\\good/ s/\\/\//g' input_file.txt
于 2009-01-30T17:35:46.440 に答える
4

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:\good がないので、次のような出力が得られますC:goodfoo.c。マシンで実際のパスを使用すると、正しく動作するはずです。)

于 2009-01-30T17:36:07.283 に答える
1

/すべての ' ' を' 'に置き換えたいと考えています\が、適切なディレクトリ パスに一致する行だけに置き換えたいと考えています。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
于 2009-01-30T17:32:24.000 に答える
0

これを試して

sed -re '/\\good\\/ s/\\/\//g' temp.txt

またはこれ

awk -F"\\" '{if($2=="good"){OFS="\/"; $1=$1;} print $0}' temp.txt

于 2013-01-21T08:05:52.870 に答える