我有一个文本文件,其中包含许多行此类内容:
/*[17:51:27][1 ms]*/ UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
有什么方法可以sed
删除评论仅有的,这就是以 a 开头/*
并以 a 结尾的所有内容*/
?这将使该行变为:
UPDATE `country` SET `region_id` = '4' WHERE `country_id` = '36';
我知道如何sed
删除以某些内容开头的整行,在包含 SQL 的文本文件的示例中,它可能是一个哈希符号#
。
答案1
因为sed
以某种greedy
方式进行匹配,所以总是有可能匹配评论末尾之后的文本,而不是前面的真实评论结束标记,例如。如包含“*/”的带引号的字符串。
这不能以简单的方式处理sed
,但您可以解决它。这是一种这样的方法:使用单字符占位符作为两个字符的结束分隔符。使用十六进制值\x01
作为替代字符是安全的(即不会与现有文本冲突),因为它在普通文本中不存在。
sed "\|^/\*.*\*/|{ s|\*/|\x01|; s|.*\x01|| }" "$file"
perl
另一方面,可以选择处理lazy
匹配(以及更多)。正如已经提到的约翰卫斯理王子在评论中,这是懒惰的 perl
相等的。
perl -ple 's|/\*.*?\*/||g' "$file"
答案2
试试这个:
sed 's@/\*[^/]*\*/@@'
不幸的是,它可能在/
内部评论方面遇到困难。
两种变体结合在一起可能会很有用:以确保绝对所有注释都被删除:
sed 's@/\*[^/]*\*/@@;s@/\*[^*]*\*/@@;'