DOSファイル内のUNIXパスへの置換
質問
私はパスのこの種を含むファイルを持っています:
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