如何从字符串中删除哈希值?

时间:2010-05-19 09:57:02

标签: regex sed

我想转换一个如下所示的行:

any text #any text# ===#text#text#text#===#

成:

any text #any text# ===#texttexttext===#

如上所示,我想删除#= =#和===#之间的# 应该删除的#的数量可以是任意数量。

我可以用sed吗?

2 个答案:

答案 0 :(得分:2)

尝试一下:

sed 'h;s/[^=]*=*=#\(.*\)/\1/;s/\([^=]\)#/\1/g;x;s/\([^=]*=\+#\).*/\1/;G;s/\n//g' inputfile

它在第一个“=#”处将行分成两行,然后删除所有不以“=”开头的“#”,然后重新组合这些行。

如果有特定情况失败,请告诉我。

修改

此版本越来越脆弱,适用于您的新示例以及原始版本:

sed 'h;s/[^=]*=[^=]*=*=#\(.*\)$/\1/;s/\([^=]\)#/\1/g;x;s/\([^=]*=[^=]*=\+#\).*/\1/;G;s/\n//g' inputfile

答案 1 :(得分:1)

sed使用GNU BRE引擎(GNU Basic Regular Expressions),它没有“新”正则表达式引擎所具有的许多功能,例如在解决此问题时非常方便的外观。

我会说你必须首先匹配===#\(.\+\)===#(请注意,GNU BRE使用反斜杠来表示捕获组和量词,并且也不支持延迟量词)。然后删除捕获的组中找到的任何#(文字搜索/替换就足够了),然后将结果放回字符串中。但我不是一个Unix人,所以我不知道是否/如何在sed中完成。