【发布时间】:2010-10-04 12:41:29
【问题描述】:
我有一个包含这种路径的文件:
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。我编写了将 oracle 转储文件更改为 frig 表空间名称的 sed 脚本。这些文件是没有指针的流格式,因此长度的变化并不重要。