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 .
*