Eu tenho o seguinte texto em um arquivo:
#1713251479
sh lowbat.sh
#1713251495
nvim lowbat.sh
#1713252186
sh lowbat.sh
e quero colocar o carimbo de data/hora Unix alinhado com o comando assim:
#1713251479 sh lowbat.sh
#1713251495 nvim lowbat.sh
#1713252186 sh lowbat.sh
Eu tentei o seguinte comando sed:
sed -zE '/^#/ s/\n/ /g' file.txt
sed -E ':a;N;$!ba;/^#/ s/\n/ /g' file.txt
A operação de substituição é aplicada, mas a condição é ignorada. O que estou faltando aqui?
Em ambas as tentativas, você lê o arquivo inteiro no buffer de edição e depois substitui todas as novas linhas por um espaço (o texto começará com a
#
, portanto a substituição é acionada em ambos os casos e é realizada em todo o buffer). Isto não gerará a saída correta, pois reuniria todo o texto em uma única linha de saída.Usando
paste
em vez disso para criar duas colunas delimitadas por tabulações. O utilitário combinará uma linha de entrada com cada uma-
em seus argumentos:Você gostaria de usar um espaço no lugar de uma guia, use
paste
com-d ' '
:Com
sed
, anexe a próxima linha ao buffer atual e substitua o caractere de nova linhased
usado para delimitar os dois por um espaço:Você gostaria de condicionar a junção das linhas ao
#
caractere no início de uma linha:Com
ed
, você pode aplicar uma substituição para adicionar um espaço no final de cada linha que começa com a e#
, em seguida, juntar a próxima linha ao final dela com oj
comando:O seguinte funciona juntando cada linha que não começa com a
#
à linha anterior, após adicionar um espaço no início. Isto juntaria todas as linhas à linha mais recente começando com#
(o exemplo foi alterado para mostrar uma instância disso).