Sed 文件中DOS到UNIX的路径替换

Sed 文件中DOS到UNIX的路径替换,sed,cygwin,awk,gcov,lcov,Sed,Cygwin,Awk,Gcov,Lcov,我有一个包含此类路径的文件: 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处理固定数量的subdir,但变量给我带来了麻烦。

我有一个包含此类路径的文件:

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处理固定数量的subdir,但变量给我带来了麻烦。实际上,我必须使用许多
s/x/y/
表达式(尽可能多的最大深度…不是很优雅)

也许是因为awk,但这种魔法超出了我的能力

仅供参考,我需要这个技巧来更正cygwin平台上的一些gcov二进制文件


我正在处理二进制文件;因此,我可能有以下类型的数据:

bindata\bindata%bindataC:\good\foo.c
应翻译为:

bindata\bindata%bindataC:/good/foo.c
第一个
\
不能翻译,尽管它在同一行


但是,在编辑此文本时,我刚刚检查了我的
.gcno
文件,看起来所有路径的两侧都是零,因此下面的大多数答案都应该合适。

您想用“
/
”代替所有“
\
”,但只能在与良好目录路径匹配的行上。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

我建议您查看
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
。如果您在机器上使用真实路径,它应该可以正常工作。)

或者在good 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
#/bin/bash
cat文件|在读取行时
做
如果
然后
回显“$LINE”>>新文件
其他的
echo“$LINE”| sed-e“s/\\/\//g”>>新文件
fi
完成

以下是我在awk中的做法:

# fixpaths.awk
/C:\\good/ {
   gsub(/\\/,"/",$1);
   print $1 >> outfile;
}
然后使用以下命令运行它:

awk -f fixpaths.awk paths.txt; mv outfile paths.txt
试试这个

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

还是这个


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

只要能正确匹配前缀,就可以在二进制文件上使用sed。我编写了sed脚本,将oracle转储文件更改为frig表空间名称。这些文件是没有指针的流格式,因此长度的更改无关紧要。
awk -f fixpaths.awk paths.txt; mv outfile paths.txt