首页 > 解决方案 > 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):// 除外

标签: sed

解决方案


您可以使用量词的贪婪特性始终只删除最后一次出现

$ 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允许使用不同的分隔符,这有助于避免转义//
    • [//]与 相同[/],表示匹配单个/
  • \(.*\)//.*对最后一组之前的部分行使用捕获组,//以便您可以使用将其放回替换部分\1

推荐阅读