以下是我的测试用例。我正在尝试匹配并打印在第一个=
忽略前导和尾随空格后发生的字符串。我的问题是我不知道如何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的正则表达式或其他工具感兴趣,我想了解为什么会发生这种情况。
由于
答案 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
这里的想法是分两步进行替换
删除字符串,包括第一个=
,即在第一个=
之后保留整个字符串
修剪前导和尾随空格。