Existe um recurso não muito conhecido de sed
que permite executar um comando. Isto é para o GNU sed e é chamado com /e
:
$ sed 's/1/echo 555/e' <<< "123"
55523
No nosso caso, vamos pegar o bloco e processá-lo através do cmd
:
Primeiramente, pegando os grupos corretamente:
$ sed -r 's/^((\w+\W+){2})\w+(.*)/printf "%s%s%s" "" "" ""/e' file
string11 string12 string12 string14 string15 string16 string17
string21 string22 string22 string24 string25 string26 string27
string31 string32 string32 string34 string35 string36 string37
string41 string42 string42 string44 string45 string46 string47
string51 string52 string52 string54 string55 string56 string57
Isso basicamente captura a linha inteira e imprime de volta através de printf
e usando os grupos capturados como argumentos. Você vê agora é um pouco bobo, porque apenas imprime de volta.
Como você pode executar cmd
na string fornecida, use:
sed -r 's/^((\w+\W+){2})\w+(.*)/printf "%s%s%s" "" "$(cmd "")" ""/e' file
Digamos que cmd
é awk 'BEGIN {print 1}'
, então diríamos:
$ sed -r 's/^((\w+\W+){2})\w+(.*)/printf "%s%s%s" "" "$(awk "BEGIN{print 1}")" ""/e' file
string11 string12 1 string14 string15 string16 string17
string21 string22 1 string24 string25 string26 string27
string31 string32 1 string34 string35 string36 string37
string41 string42 1 string44 string45 string46 string47
string51 string52 1 string54 string55 string56 string57
Como você vê, a ideia aqui é
Tudo isso é baseado em Sed substitui a saída de um comando bash usando o grupo de captura como argumento que eu criei com base no Como alterar o formato da data no sed? .