BRE如何在行尾匹配空格?

时间:2013-11-20 18:22:46

标签: regex sed

以下是我的测试用例。我正在尝试匹配并打印在第一个=忽略前导和尾随空格后发生的字符串。我的问题是我不知道如何match up to trailing white spaces or the end of line。似乎它在领先但尾随空格方面工作正常有问题。我猜它与优先权有关,但我不能自己解决这个问题:

echo "TITLE=  B=ack=To ian   " | sed -n -e 's/[^=]*=[[:blank:]]*\(.*\)[[:blank:]]*$/\1/p' | od -tx1 -tc

0000000  42  3d  61  63  6b  3d  54  6f  20  69  61  6e  20  20  20  0a
          B   =   a   c   k   =   T   o       i   a   n              \n

有趣的是,如果我将这些空格设置为空格__而不是[[:blank:]]*,则表达式可以正常工作,但它会失去灵活性:

echo "TITLE=  B=ack=To ian   " | sed -n -e 's/[^=]*=[[:blank:]]*\(.*\)   $/\1/p' | od -tx1 -tc

0000000  42  3d  61  63  6b  3d  54  6f  20  69  61  6e  0a
          B   =   a   c   k   =   T   o       i   a   n  \n

Ps,我对如何使用Perl的正则表达式或其他工具感兴趣,我想了解为什么会发生这种情况。

由于

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

echo "TITLE=  B=ack=To ian   " | sed -n -e 's/[^=]*=[[:blank:]]*\(.*[^[:blank:]]\)[[:blank:]]*$/\1/p' | od -tx1 -tc

由于量词*是贪婪的,它可以抓住它。当您编写\(.*\)[[:blank:]]*$时,由于*使字符类[[:blank:]]可选(零或更多),所有字符都被前一个\(.*\)

吃掉

答案 1 :(得分:0)

问题不在于[[:blank:]]*,而在于.*。由于*是贪婪的,它也匹配尾随空格。

我希望使用[[:space:]]代替[[:blank:]]

[:blank:]   [ \t]           space and TAB characters only
[:space:]   [ \t\n\r\f\v]   blank (whitespace) characters

尝试关注sed

echo "TITLE=  B=ack=To ian   " | sed -rn -e 's/^[^=]*=//' -e 's/^[[:space:]]*|[[:space:]]*$//gp' | od -tx1 -tc

输出:

0000000  42  3d  61  63  6b  3d  54  6f  20  69  61  6e  0a
          B   =   a   c   k   =   T   o       i   a   n  \n

这里的想法是分两步进行替换

  1. 删除字符串,包括第一个=,即在第一个=之后保留整个字符串

  2. 修剪前导和尾随空格。