Precisa mover uma única linha com PRM:TRG
palavra-chave para o topo do arquivo usando sed
Conteúdo do arquivo:
FOOBAR:SCN:NO_TRG
FIZZBAR:SCN:NO_TRG
BEBAR:PRM:TRG
Resultado esperado:
BEBAR:PRM:TRG
FOOBAR:SCN:NO_TRG
FIZZBAR:SCN:NO_TRG
Precisa mover uma única linha com PRM:TRG
palavra-chave para o topo do arquivo usando sed
Conteúdo do arquivo:
FOOBAR:SCN:NO_TRG
FIZZBAR:SCN:NO_TRG
BEBAR:PRM:TRG
Resultado esperado:
BEBAR:PRM:TRG
FOOBAR:SCN:NO_TRG
FIZZBAR:SCN:NO_TRG
Com o
ed
editor de linha, o comando... moveria a próxima linha correspondente à expressão regular
PRM:TRG
para a primeira linha (0
significando "após a linha zero"). "A próxima linha correspondente ..." significa que, quando o editor é iniciado, a primeira linha do arquivo corresponde à expressão regular fornecida.Para mover todas as linhas correspondentes para o topo do arquivo, você usaria o
g
comando para executar om
comando para cada linha correspondente:(Isso também funcionaria em Ex, Vi e Vim, mas não no Vi do BusyBox.)
Na linha de comando, você poderia executar este segundo comando de edição assim:
Os comandos extras
,p
imprimemQ
o buffer modificado na saída padrão e, em seguida, saem incondicionalmente do editor sem salvar. Substitua,p
eQ
porw
eq
para gravar silenciosamente o resultado de volta no arquivo original e sair.O usuário Shawn percebeu que isso inverteria a ordem das
PRM:TRG
linhas e que você poderia contrariar isso movendo todas as linhas que não correspondem ao padrão para o final do arquivo comv/PRM:TRG/ m $
.Outra maneira de corrigir isso é definir uma marca na primeira linha original com
1ka
(a marca éa
) e, em seguida, mover todas as linhas correspondentes para antes dessa linha comg/PRM:TRG/ m 'a-
.Uma abordagem de 2 passagens usando
grep
: Faça com que todas as linhas correspondamPRM:TRG
primeiro e depois as que não correspondem.Com
sed
: imprima cada linha correspondentePRM:TRG
à medida que você as encontrar e armazene todas as outras linhas no espaço de espera. Quando você ficar sem linhas para ler, troque o espaço de espera e imprima-o (os
comando no final elimina a nova linha inicial no espaço de espera (que só estará lá se forH
adicionado algo a ele) e imprime se houver há alguma coisa lá).Uma tradução (mais ou menos) desse
sed
comando emawk
:Uma tradução mais próxima:
Com
perl
:Adicione uma
-i
opção para editar o arquivo no local ou-i.back
para salvar o original com uma.back
extensão antes de fazer isso.Você pode processar mais de um arquivo dessa maneira, mas precisará redefinir
@saved
entre cada um:Se você tiver sed, também terá o awk - usando qualquer awk e uma abordagem de 2 passagens, apenas lendo uma linha por vez na memória:
ou usando 1 passagem, mas salvando a entrada na linha de destino na memória:
Usando Raku (anteriormente conhecido como Perl_6)
Acima estão as respostas escritas em Raku, um membro da família Perl de linguagens de programação. A primeira resposta usa
-ne
sinalizadores de não impressão automática do Raku (awk
comportamento semelhante). Em umBEGIN
bloco, um@non-match
array é declarado. O corpo do loop usa o operador ternário Test??
True!!
False de Raku , que imediatamente eliminaput
as linhas correspondentes (as linhas não correspondentes sãopush
inseridas no@non-match
array). Finalmente, em umEND
bloco, o@non-match
array está foraput
.(A segunda resposta acima é semelhante à primeira, mas usa
lines()
a rotina do Raku para ler as linhas. Nesse caso, apenas o-e
sinalizador é necessário).Entrada de amostra:
Saída de amostra:
NOTA: Embora o código acima seja bastante simples, no verdadeiro espírito TMTOWTDI você pode escrever várias respostas Raku diferentes. Abaixo, um arquivo é lido
line
no@a
array. Rakugrep
é usado para extrair correspondências, aqui retornadas como:p
pares (a chave é igual ao número da linha, enquanto o valor é igual ao texto da linha). As correspondências são salvas na@match
matriz e depois impressas. Em seguida, as linhas não correspondentes são geradas: a@a
matriz recebe um[ ... ]
índice que calcula a(-)
diferença assimétrica do conjunto de^@a.elems
posições de índice(-)
menos as correspondências.Para todas as respostas acima, tentei evitar uma abordagem de duas passagens. Mas, no interesse da integridade, o Raku
grep
pode retornar linhas não correspondentes: veja ogrep
link abaixo para obter detalhes.https://docs.raku.org/language/operators#infix_??_! !
https://docs.raku.org/routine/grep
https://docs.raku.org/language/setbagmix
https://raku.org
Para não correspondências (
!
), anexe aoH
espaço antigo. Em seguida,p
imprima partidas (//
). Ao chegar à última linha ($
),g
et o conteúdo do espaço de espera, substituindo o espaço de padrão. Em seguida, remova a primeira nova linha para evitar que uma linha vazia seja anexada a um espaço de espera vazio com a primeira não correspondência. Finalmente,p
imprima essas linhas não correspondentes.