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.