質問

私はパスのこの種を含むファイルを持っています:

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/式を使用する必要があります。

のawkであってもよいが、魔法のこの種は、自分のスキルを超えている可能性があります。

ちなみに、私はcygwinのプラットフォーム上でいくつかのgcovのバイナリファイルを修正するためにこのトリックを必要とします。

<時間>

私は、バイナリファイルを取り扱っております。そのため、私は次のデータの種類を持っているかもしれません。

bindata\bindata%bindataC:\good\foo.c

と訳されるべきです

bindata\bindata%bindataC:/good/foo.c

最初\は、同じライン上にあることにもかかわらず、翻訳されていない必要があります。

ただし、このテキストを編集しているとき、私はちょうど私の.gcnoファイルをチェックして、それが下の回答のほとんどが収まる必要がありますので、すべてのパスは、ゼロで挟まれているように見えます。

役に立ちましたか?

解決

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

または古き良きバッシュからいくつかの助けを借りてます:

#!/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