我想转换一个如下所示的行:
any text #any text# ===#text#text#text#===#
成:
any text #any text# ===#texttexttext===#
如上所示,我想删除#= =#和===#之间的# 应该删除的#的数量可以是任意数量。
我可以用sed吗?
答案 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中完成。