在POSIX BRE中表达替代品?

时间:2015-06-21 04:32:55

标签: regex sed

是否可以编写与两个任意字符串完全匹配的POSIX BRE(不支持\|)?假设您希望与this_string1_thatthis_string2_that匹配this_\(string1\|string2\)_that,而不是\|。我想这会很丑陋,因为\(string1\)\{0,1\}\(string2\)\{0,1\}匹配“string1string2”

编辑:也许string1 / string2不是最好的例子,因为它们很接近。重点是任意字符串,我正在寻找任何两个字符串的编码算法。

Edit1:找到与

匹配的BRE
  • this_TWWXP6rfgMwRbuG6ugDAMohq3FaQsI1mwThL47JoQrdMvIWTUGTdXi6dGzTqfRs_that
  • this_oMfnmAwM8rKrsJniq5VGYFPs0EEBKKZgiHQhe5WXIVO8TieSspJ3GDnqpr8wDSU_that

3 个答案:

答案 0 :(得分:1)

寻找这样的东西?

sed -n -e '/this_string1_that/p' -e '/this_string2_that/p' file

答案 1 :(得分:1)

使用基本POSIX(BRE)sed,您可以使用:

/this_\(TWWXP...TqfRs\)\{0,1\}\(oMfn...8wDSU\)\{0,1\}_that/

我替换了字符串...的中心,以便您可以看到命令的整体结构。您可以写出完整的字符串,或者将代码写出来。正则表达式也匹配this_Part1Part2_that,但非恶意地输入的可能性几乎可以忽略不计。更严重的是,它会匹配this__that,这与输入相比更不可信。您可以使用显示为主过滤器的模式;然后,您可以对外部标记之间的某些数据进行二次过滤:

/this_\(TWWXP...TqfRs\)\{0,1\}\(oMfn...8wDSU\)\{0,1\}_that/ {
    /this_.\{63\}_that/ { ...process a genuine match... }
}

(我计算了琴弦的长度,得到了63而不是64,这让我感到非常惊讶。)

然而,这比写出两个表达式要困难得多,就像Cyrusanswer一样。

答案 2 :(得分:0)

不,它无法完成,有问题的sed也不支持{0,1}