sed:如何在两个斜杠后//删除字符串中的所有内容?

时间:2018-10-28 13:18:39

标签: sed

我有一行代码

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)://

除外

2 个答案:

答案 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