我有一行代码
require_once(PATH_ROOT).'/calls/inumber.php'); //this is a comment<br>
我想在//后用SED删除所有内容。我的第一次尝试是
sed -i 's/[//].*//' file;
但这会删除(PATH.ROOT)之后的所有内容。'/
我要删除注释,而不是PATH。 Ir不在上面的示例中,但是如何排除SED,也不要删除http://,因为也有两个//。
编辑:好吧,任务是删除所有以至少两个斜杠开头的“单行注释”。紧随其后的是什么字母/数字/符号,什么都不要替换。唯一的例外是http(s)://,应将其跳过。实例和结果:
$ a = 5; //第一条评论
$ a = 5;
$ b = 10; //////第二条评论
$ b = 10;
$ c = 15; /// / *&/ $%§$%&/&第三条评论
$ c = 15;
////////////////////////////
应该为空字符串
/ *测试评论* /
/ *测试注释* /-->不变,没有两个斜杠
摘要://之后的所有内容都应删除(包括两个//),但http(s)://
除外答案 0 :(得分:1)
您可以使用量词的贪婪性质来始终仅删除最后一次出现的情况
$ cat ip.txt
require_once(PATH_ROOT).'/calls/inumber.php'); //this is a comment<br>
http://foo/123 //commenting stuff
a//b/c/d 1//23/4/5 //commented
$ sed 's|\(.*\)//.*|\1|' ip.txt
require_once(PATH_ROOT).'/calls/inumber.php');
http://foo/123
a//b/c/d 1//23/4/5
sed
允许different delimiters to be used,这有助于避免不得不转义//
[//]
与[/]
相同,表示它与单个/
匹配\(.*\)//.*
使用捕获组作为最后一组//
之前的行的一部分,以便您可以使用\1
将其放回替换部分答案 1 :(得分:0)
现在,您已经更改了很多问题,这是一个不应该删除任何URL(文件://或http://或https://或任何://)的sed-它会忽略{ {1}},但在两个斜杠后删除所有内容:
://
它匹配所有非sed 's|\([^:]\)//.*$|\1|'
(保存该字符)后跟:
的字符,并匹配该行末尾的所有字符,仅返回第一个非//
字符。
:
sed 's|//[^/]*$||'
进行s
的迭代,然后将非斜杠//
零次或多次[^/]
到行*
的末尾,然后将其替换为什么都没有。
如果您也想在注释之前匹配并删除任何空格,则可以使用空格字符类$
\s
请注意,注释中不能包含斜线,因为除非您识别并排除了URL,否则它将与URL作为注释匹配。
只要您想保留sed 's|\s*//[^/]*$||'
(因为您说“ 在// //之后删除所有内容……” ),就可以放回它们:>
//
注意:要删除所有PHP注释,请遵循以下答案Best way to automatically remove comments from PHP code