Como eu dobro cada linha de saída canalizada? [duplicado]

2

Como eu dobro cada linha de entrada canalizada?

Exemplo:

echo "foobar" | MYSTERY_COMMAND
foobar
foobar

    
por eadsjr 06.05.2016 / 05:46

2 respostas

5

Use apenas sed p .

echo foobar | sed p

Você não precisa de cat :

sed p input.txt
# or
sed p input.txt > output.txt

Explicação

p é o comando sed para "imprimir".

Imprimir também é a ação padrão do sed . Então quando você diz sed explicitamente para imprimir, o resultado é que ele imprime todas as linhas duas vezes .

Digamos que você queira imprimir apenas linhas que incluam a palavra "kumquat". Você pode usar -n para suprimir a ação padrão de impressão de sed e, em seguida, informar explicitamente para imprimir linhas que correspondam a /kumquat/ :

sed -n /kumquat/p

Ou se você quiser apenas imprimir a quinta linha e nada mais:

sed -n 5p

Ou, se você quiser imprimir todas as linhas da 15ª linha até a 27ª linha:

sed -n 15,17p

Se quiser imprimir todas as linhas exceto que contenham "kumquat", você poderá fazer isso excluindo todas as linhas do kumquat e permitindo que a ação padrão sed de imprimir a linha ocorrer em linhas não excluídas. Você não precisaria do sinalizador -n nem do comando explícito p :

sed /kumquat/d

sed funciona em um padrão simples - sintaxe de ação. Nos exemplos acima, mostrei padrões baseados em números de linha e padrões baseados em regex, e apenas duas ações (imprimir e excluir). sed tem um lote mais poder do que isso.

Eu realmente deveria incluir o comando sed mais comum e útil que existe:

sed s/apples/oranges/g

Isso substitui todas as ocorrências de "apples" por "laranjas" e imprime o resultado.

(Se você omitir o sinalizador g lobal ao comando s ubstitute, apenas a primeira instância em cada linha será alterada.)

Leitura adicional (altamente recomendado):

por 06.05.2016 / 05:53
0
cat input.txt | awk '1;1' > output.txt 

edit: esta é a versão menos detalhada do joepd, original abaixo

cat input.txt | awk '{print $0 "\n" $0}' > output.txt 
    
por 06.05.2016 / 05:46