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