如何用#include" ... \ ..."中的正斜杠替换反斜杠

时间:2015-03-03 17:03:14

标签: regex perl sed

我想知道是否可以替换文件语句,如:

#include "foo\bar\something\else"
#include "..\..\foo.h"

#include "foo/bar/something/else"
#include "../../foo.h"

我可以使用Perl pie或sed多次:

s|(\#include.*)\\|\1/|

但我想知道在正则表达式中是否存在类似第一个指令的内容,即 s|^#include\Z\\|/|g其中\Z是我正在寻找的修饰符。

修改 当然我只会在#include指令上替换反斜杠。

s@\@/@g

在我的情况下不起作用

3 个答案:

答案 0 :(得分:2)

perl -pe'tr{\\}{/} if /^\s*#\s*include/'

部分文字与两次匹配,但金额非常小。替代方案(如anubhava的回答中所见)相当混乱,最终可能不会比两次与某些文本匹配更快。

此方法的sed版本已添加到anubhava的答案中,而且速度更快。

答案 1 :(得分:1)

使用perl

perl -pe 's~(?:#include|(?!^)\G)[^\\]*\K\\~/~g' file
#include "foo/bar/something/else"
#include "../../foo.h"

使用sed

sed '/#include/s~\\~/~g' file
#include "foo/bar/something/else"
#include "../../foo.h"

或者,如果您想将所有\替换为/,请使用tr

tr '\\' "/" < file
#include "foo/bar/something/else"
#include "../../foo.h"

答案 2 :(得分:0)

哟可以使用sed

sed 's|\|/||g' file
#include "foo\bar\something\else"
#include "..\..\foo.h"

仅替换为#include

的行
sed '/#include/s|\\|/|g' file
#include "foo/bar/something/else"
#include "../../foo.h"

awk '/^#include/ {gsub(/\\/,"/")}1' file
#include "foo/bar/something/else"
#include "../../foo.h"