为什么perl regex。*在空分隔记录中不识别\ n。 $ / =“\ 0'

时间:2012-08-16 22:50:54

标签: regex perl substitution

我正在尝试解析一些\x00空分隔数据。我认为在-pe/-ne循环中,$_在替换正则表达式的模式匹配方面等同于.* ...但是正如我的示例所示,它们并不相同。 ..

                                                  #      ↓↓‾‾ works, but is not a regex
printf 'aaa\n\0bbb\n\0' | perl -ne 'BEGIN{ $/="\0"; }; s/$_/\"$.$&\"/ and print;' |xxd
printf 'aaa\n\0bbb\n\0' | perl -ne 'BEGIN{ $/="\0"; }; s/.*/\"$.$&\"/ and print;' |xxd
                                                  #      ↑↑__ gives un-expected output

# output                                          #      ↓       ↓ 
0000000: 2231 6161 610a 0022 2232 6262 620a 0022  "1aaa..""2bbb.."
0000000: 2231 6161 6122 0a00 2232 6262 6222 0a00  "1aaa".."2bbb"..
                                                  #    ↑       ↑

获取s/ / /类型的替换以识别完整$_需要什么?

1 个答案:

答案 0 :(得分:5)

除非使用.修饰符,否则

\n/s不匹配。

printf 'aaa\n\0bbb\n\0' | perl -ne 'BEGIN{ $/="\0"; }; s/.*/\"$.$&\"/s and print;' |xxd

或者,可以使用字符类代替.

printf 'aaa\n\0bbb\n\0' | perl -ne 'BEGIN{ $/="\0"; }; s/[\s\S]*/\"$.$&\"/ and print;' |xxd

此处,[\s\S]匹配任何空格或非空格字符(换句话说,任何字符)。