Fora do vim , que poderia ser usado para alcançar o resultado, há uma série de ferramentas de linha de comando que podem alcançar o mesmo resultado. Usando o perl como exemplo:
perl -n -e '$name=$1 if(/^(Name: .+)$/); print "$name\n\n$_\n" if(/^Occupation: .+/);' < file > out.txt
perl -n diz ao perl para agrupar cada linha da entrada padrão ( STDIN ) em um loop while.
Podemos redirecionar um arquivo para o STDIN se usarmos < file no final do comando perl.
Isso tem o efeito de permitir que você execute comandos perl em cada linha do file que redirecionamos.
Em seguida, especificamos quais comandos o perl deve executar com a opção -e , que seguimos:
'$name=$1 if(/^(Name: .+)$/); print "$name\n\n$_\n" if(/^Occupation: .+/);'
(observe as aspas simples ' em torno das instruções perl, pois o perl precisa da opção -e como um único argumento na linha de comando).
Quanto à lógica do código,
$name=$1 if(/^(Name: .+)$/);
se uma linha começar ^ com Name: seguido por um ou mais caracteres .+ e, em seguida, o final da linha $ , poderemos armazenar toda essa correspondência se a envolvermos em () e ele ficará disponível em uma variável especial chamada $1 . Portanto, todo Name: whatever é armazenado em $1 . Em seguida, atribuímos isso a uma variável chamada $name .
Semelhante à instrução anterior, fazemos o seguinte:
print "$name\n\n$_\n" if(/^Occupation: .+/);'
se uma linha começar ^ com Occupation: seguido por um ou mais caracteres .+ e, em seguida, o final da linha $ , imprima a linha de nome correspondida anteriormente (armazenada em $ name), duas novas linhas \n\n e, em seguida, $_ , que é o conteúdo da linha atual que o loop while está processando (no nosso caso, a linha de ocupação do jogo), seguida por outra nova linha de linha \n ;
Finalmente, redirecionamos a saída desse comando para out.txt com > out.txt .
Existe uma suposição de que cada Name: é seguido (algumas linhas depois) com uma Ocupação relacionada a esse Name: , se você tiver várias linhas de Ocupação, então você imprimirá mais de um nome e ocupação. Além disso, se o nome não tiver uma linha de ocupação, ele não será impresso.