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/表达式(与最大深度一样多......不是很优雅)。

可能是用awk,但这种魔法超出了我的技能。

仅供参考,我需要这个技巧来纠正 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 回答
1

以下是我在 awk 中的做法:

# fixpaths.awk
/C:\\good/ {
   gsub(/\\/,"/",$1);
   print $1 >> outfile;
}

然后使用以下命令运行它:

awk -f fixpaths.awk paths.txt; mv outfile paths.txt
于 2009-01-30T17:50:06.023 回答
0

或者在好的 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
于 2009-01-30T17:41:32.717 回答
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 回答