Canalize sua lista de arquivos para
sed -n '$!N;/\(.*\)1.txt\n.txt/!{P;D;}'
Isso sempre lê um par de linhas e, se não for um par de something1.txt
com something2.txt
, a linha órfã é impressa, então é dada a sua "saída ideal esperada".
Explicação detalhada:
-
N
acrescenta a próxima linha ao espaço padrão, então você tem duas linhas, incluindo a nova linha entre
-
/\(.*\)1.txt\n.txt/
é um "endereço", selecionando se o próximo comando deve ser executado. Pode ser um número de linha, um intervalo ou, neste caso, uma expressão regular que deve corresponder ao espaço do padrão. .*
pode corresponder a qualquer string e cercá-la com \(.*\)
, depois podemos referenciá-la como
. Portanto, \n
significa uma nova linha, seguida pela cadeia desde o início, seguido por 2
. Assim, estamos pesquisando por anystring1.txt
anystring2.txt
- O
!
após o endereço inverte a correspondência, portanto, o seguinte só é executado se o espaço do padrão não corresponder à expressão. Este é o caso se a linha não pertencer a um par.
- o
{}
forma um bloco de comandos, o que significa que todos os comandos internos são executados apenas se o padrão corresponder
-
P
imprime o espaço do padrão até a primeira nova linha, portanto, apenas a primeira linha é impressa (porque não sabemos se o segundo pode pertencer a um par).
- finalmente,
D
apaga o espaço do padrão até a primeira nova linha e o próximo ciclo é iniciado com a linha restante, que será novamente tentada emparelhar com a seguinte.
Espero que esta explicação tenha ajudado você a aprender um pouco de sed
.
*