使用 sed 仅删除字符串中出现的特定文本

使用 sed 仅删除字符串中出现的特定文本

我有一个文本文件,其中包含许多行此类内容:

/*[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@/\*[^*]*\*/@@;'

相关内容