Adicione texto no final de cada linha

90

Estou na linha de comando do Linux e tenho um arquivo com

127.0.0.1
128.0.0.0
121.121.33.111

eu quero

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Lembro que meus colegas estavam usando o sed para isso, mas depois de ler o manual do sed ainda não está claro como fazer na linha de comando?

user2275580
fonte
2
Ótima pergunta e eu amo como você a formulou.
Anthony Rutledge,

Respostas:

139

Você pode tentar usar algo como:

sed -n 's/$/:80/' ips.txt > new-ips.txt

Desde que o formato do arquivo seja o mesmo que você descreveu na pergunta.

O s///comando de substituição corresponde ( localiza ) o final de cada linha em seu arquivo (usando o $caractere) e, em seguida, anexa ( substitui ) o :80ao final de cada linha. O ips.txtarquivo é seu arquivo de entrada ... e new-ips.txté seu arquivo recém-criado ( o resultado final de suas alterações ) .


Além disso, se você tiver uma lista de números IP que já possuem números de porta anexados, (conforme observado por Vlad e fornecido por aragaer ), você pode tentar usar algo como:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

Então, por exemplo, se o seu arquivo de entrada fosse parecido com isto (observe o :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

O resultado final seria mais ou menos assim:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80
summea
fonte
@Vlad Sim; mas de acordo com os OPs de entrada de exemplo fornecidos ... não deve haver nenhum número de porta na lista de IPs. :) Mesmo se houvesse ... o OP poderia apenas rodar outro sed s///antes para tirar qualquer número de porta no final de cada linha.
verão
1
Ok, só esclarecendo ... Talvez devesse haver uma condição para excluir linhas onde já existe uma porta.
Vlad,
3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer
3
Adicione à sua própria resposta. A sugestão de excluir linhas com portas já está aqui nos comentários, acabei de escrever o comando exato.
Aragaer
2
Se o arquivo tiver terminadores CRLF, o :80será adicionado ao início da linha seguinte. Use dos2unixno arquivo primeiro, se necessário.
djnz0feh de
13

Versão concisa do comando sed :

sed -i s/$/:80/ file.txt

Explicação:

  • sed s tream ed itor
    • -i i n-place (editar arquivo no local)
    • s s comando ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ declaração
    • $corresponde ao final da linha ( replacement_from_reg_exp )
    • :80texto que você deseja adicionar no final de cada linha ( substituição_to_texto )
  • file.txt o nome do arquivo
simhumileco
fonte
12
sed 's/.*/&:80/'  abcd.txt >abcde.txt
Sudhir
fonte
12

Se você gostaria de adicionar texto no final de cada linha no local (no mesmo arquivo), você pode usar o -iparâmetro, por exemplo:

sed -i'.bak' 's/$/:80/' foo.txt

No entanto, a -iopção é uma extensão Unix não padrão e pode não estar disponível em todos os sistemas operacionais.

Portanto, você pode considerar o uso de ex(que é equivalente a vi -e/ vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

que será adicionado :80a cada linha, mas às vezes pode acrescentá-lo a linhas em branco.

Portanto, o melhor método é verificar se a linha realmente contém qualquer número e, em seguida, anexá-lo, por exemplo:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

Se o arquivo tiver um formato mais complexo, considere o uso de regex adequado, em vez de [0-9].

Kenorb
fonte
0

Usando um editor de texto, verifique ^M(control-M ou retorno de carro) no final de cada linha. Você precisará removê-los primeiro e, em seguida, acrescentar o texto adicional no final da linha.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt
John
fonte
0
  1. Você também pode conseguir isso usando a técnica de referência anterior

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Você também pode usar com awk como este

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    
k_vishwanath
fonte
-1

sed -i 's / $ /, / g' foo.txt

Eu faço isso com bastante frequência para adicionar uma vírgula ao final de uma saída para que eu possa facilmente copiar e colar em um array Python (ou seu idioma favorito)

rico
fonte