^0806EA^0406F0^^^^^^EF07F7--^E3DC03--^EAFE02--
^0406F0^^^FFE209^^^DFF107^^^F6F508^^^E4DE01^^^EF07F7--^E803E6--
在上面的代码中,我想拆分这个^但问题是,这个十六进制数据有相同的模式^。
我想要这样的结果:
^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02--
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6--
或:
0806EA 0406F0^^^^^ EF07F7-- E3DC03-- EAFE02--
0406F0^^ FFE209^^ DFF107^^ F6F508^^ E4DE01^^ EF07F7-- E803E6--
答案 0 :(得分:2)
一种方式:
perl -pe 's/(?<=.)(?=\^\w)/ /g' infile
说明:
s/regex/replacement # Substitution command.
(?<=.) # Positive look-behind for any char.
(?=\^\w) # Positive look-ahead for '^' plus a word character.
# Add a space between them.
结果:
^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02--
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6--
答案 1 :(得分:2)
由于您不希望在拆分中使用任何字符 - 并且您似乎也不希望它们本身作为一个组,您需要所谓的“零宽度断言”。由于我们谈论的是插入符号,因此字边界不起作用。它不在一条线的开头或结尾,因此唯一可行的ZWA是前瞻或后视。
由于你想打破指定模式的前面的,我建议前瞻,包括:插入符号+非插入符号或字符串结尾,如下所示:
split /(?=\^(?:[^^]|$))/;
如下图所示:
while ( <DATA> ) {
my @list = split /(?=\^(?:[^^]|$))/;
say "@list";
}
__DATA__
^0806EA^0406F0^^^^^^EF07F7--^E3DC03--^EAFE02--
^0406F0^^^FFE209^^^DFF107^^^F6F508^^^E4DE01^^^EF07F7--^E803E6--
输出:
^0806EA ^0406F0^^^^^ ^EF07F7-- ^E3DC03-- ^EAFE02--
^0406F0^^ ^FFE209^^ ^DFF107^^ ^F6F508^^ ^E4DE01^^ ^EF07F7-- ^E803E6--