Adiciona um novo caractere de linha em um arquivo de texto usando sed [duplicate]

2

Eu quero adicionar o seguinte ao arquivo /etc/securetty usando sed :

pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9

Eu escrevi o seguinte comando para essa finalidade:

sed -i '$a pts/0\npts/1\npts/2\npts/3\npts/4\npts/5\npts/6\npts/7\npts/8\npts/9' /etc/securetty

que me dá a saída:

pts/0\npts/1\npts/2\npts/3\npts/4\npts/5\npts/6\npts/7\npts/8\npts/9

Eu claramente estou perdendo alguma coisa aqui. O que poderia estar errado no meu comando sed ?

    
por skrowten_hermit 14.04.2017 / 07:24

3 respostas

6

Abordagem simples shell :

for i in {0..9}; do echo "pts/"$i; done >> /etc/securetty

>> - para anexar a saída ao arquivo

> - para direcionar a saída para o arquivo (sobrescrevendo)

    
por 14.04.2017 / 08:58
4

A propósito, se você quiser acrescentar ao end de um arquivo existente algo assim, você não precisa nem sed nem um loop de shell. É apenas um comando:

$ printf '%s\n' "pts/"{0..10} >> /etc/securetty

Se você quiser inserir no início do arquivo, ainda poderá fazê-lo com printf:

$ cat file1
europe|EU
australia|AU
china|CN
$ printf '%s\n%s\n' "pts/"{0..10} "$(<file1)"
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9
pts/10
europe|EU
australia|AU
china|CN

Você pode substituir o conteúdo do seu arquivo /etc/securetty assim (mesmo sed -i faz exatamente o mesmo trabalho nos bastidores):

$ printf '%s\n%s\n' "pts/"{0..10} "$(</etc/securetty)" > tmpsecure && mv -f tmpsecure /etc/securetty

Alternativa:

$ { printf '%s\n' "pts/"{0..10}; cat /etc/securetty; } > tmpsecure && mv -f tmpsecure /etc/securetty
# Or
# cat <(printf '%s\n' "pts/"{0..10}) /etc/securetty > tmpsecure && mv tmpsecure /etc/securetty
    
por 14.04.2017 / 14:03
2

Deve ser:

sed -i 'a pts/0\npts/1\npts/2\npts/3\npts/4\npts/5\npts/6\npts/7\npts/8\npts/9' /etc/securetty

Como alternativa, você pode colocar o conteúdo em um arquivo e usar a opção read (r) do sed para anexar ao arquivo de destino.

Exemplo:

$ cat input.txt
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9

$ cat /etc/securetty
This is a dummy file

Comando:

sed -i 'r input.txt' /etc/securetty

O arquivo /etc/securetty é modificado conforme abaixo:

$ cat /etc/securetty
This is a dummy file
pts/0
pts/1
pts/2
pts/3
pts/4
pts/5
pts/6
pts/7
pts/8
pts/9
    
por 14.04.2017 / 08:47