我想知道是否可以替换文件语句,如:
#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
在我的情况下不起作用
答案 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"