如何在所有 #include "...\..." 中用正斜杠替换反斜杠

How to replace backslashes with forward slashes in all #include "...\..."

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

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

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

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

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

但我想知道正则表达式中是否有类似于第一个指令的东西 s|^#include\Z\|/|g 其中 \Z 是我正在寻找的修饰符对于.

编辑 当然,我只会替换#include 指令中的反斜杠。

s@\@/@g

不适用于我的情况

使用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"

你可以使用 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"
perl -pe'tr{\}{/} if /^\s*#\s*include/'

部分文字匹配了两次,但数量很少。替代方案(如 anubhava 的回答所示)相当混乱,最终可能不会比匹配某些文本两次更快。

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