Parece que você quer preservar espaços entre palavras alfanuméricas e converte todos os outros em novas linhas, então talvez:
perl -pe 's{([^\d\s]\S*\s+)(?=\S*[^\d\s])|\s+}{$1//"\n"}ge'
Eu tenho essa linha
word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5
Eu quero dividir essa linha para inserir uma quebra de linha antes de um campo numérico ou antes de um campo alfanumérico que esteja logo após um campo numérico, então a saída seria:
word1 word2
1234
4567
word3
8901
word4 word5
2541
5142
word5
Todos os campos alfanuméricos começam com letras
echo "word1 word2 1234 4567 word3 8901 word4 word5 2541 5142 word5" |perl -pe 's/(\s)([0-9]+)/$1\n$2/g; s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g;'
Explicação:
perl -pe
: execute o seguinte script Perl em cada linha de entrada e
resultados de impressão s/(\s)([0-9]+)/$1\n$2/g
: espaço em branco + campo numérico
- > espaço em branco + nova linha + campo numérico s/(\s)([0-9]+)(\s+)([a-zA-Z])/$1$2\n$4/g
: espaço em branco + numérico
campo + espaço em branco + campo alfanumérico - > espaço em branco + campo numérico + nova linha + campo alfanumérico g
no final de cada substituição significa 'global' - faça isso para toda a linha Coloque o seguinte código em um script awk. Digamos que o script seja chamado de do_magic.awk
#!/usr/bin/awk -f
{
str=$1
for (i=2;i<=NF;++i)
if ($i ~ /^[0-9]+/) str = str "\n" $i "\n"
else str = str " " $i
gsub(/\n[[:space:]]*/,"\n",str)
print str
}
Chame o script usando
do_magic.awk yourfile
O resultado é:
word1 word2
1234
4567
word3
8901
word4 word5
2541
5142
word5
PS: Eu tive alguma solução de trabalho, pensei. No freenode #awk, geirha
forneceu a resposta completa. Então os créditos vão para ele!