Agrega texto al final de cada línea


93

Estoy en la línea de comandos de Linux y tengo un archivo con

127.0.0.1
128.0.0.0
121.121.33.111

yo quiero

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Recuerdo que mis colegas estaban usando sed para eso, pero después de leer el manual de sed todavía no está claro cómo hacerlo en la línea de comandos.


2
Gran pregunta y me encanta cómo la enmarcaste.
Anthony Rutledge

Respuestas:


141

Puedes intentar usar algo como:

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

Siempre que su formato de archivo sea el que ha descrito en su pregunta.

El s///comando de sustitución coincide ( encuentra ) el final de cada línea en su archivo (usando el $carácter) y luego agrega ( reemplaza ) el :80al final de cada línea. El ips.txtarchivo es su archivo de entrada ... y new-ips.txtes su archivo recién creado ( el resultado final de sus cambios ) .


Además, si tiene una lista de números de IP que ya tienen números de puerto adjuntos (como lo señaló Vlad y lo proporcionó aragaer ), podría intentar usar algo como:

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

Entonces, por ejemplo, si su archivo de entrada se veía así (tenga en cuenta :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

El resultado final se vería así:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

1
Ok, solo aclarando ... Tal vez debería haber una condición para excluir líneas donde ya existe un puerto.
Vlad

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer

3
Agréguelo a su propia respuesta. La sugerencia de excluir líneas con puertos ya está aquí en los comentarios, acabo de escribir el comando exacto.
aragaer

3
Si el archivo tiene terminadores CRLF, :80se agregará al principio de la siguiente línea. Use dos2unixprimero en el archivo si es necesario.
djnz0feh

1
es lo -nnecesario? probablemente no para la mayoría de los usuarios.
jimh

17

Versión concisa del comando sed :

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

Explicación:

  • sed s tream ed Itor
    • -i i n-place (editar archivo en su lugar)
    • s s comando ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ declaración
    • $coincide con el final de la línea ( replacement_from_reg_exp )
    • :80texto que desea agregar al final de cada línea ( reemplazo_a_texto )
  • file.txt el nombre del archivo


12

Si desea agregar texto al final de cada línea en el lugar (en el mismo archivo), puede usar el -iparámetro, por ejemplo:

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

Sin embargo, la -iopción es una extensión Unix no estándar y puede que no esté disponible en todos los sistemas operativos.

Entonces puede considerar usar ex(que es equivalente a vi -e/ vim -e):

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

que se agregará :80a cada línea, pero a veces puede agregarlo a líneas en blanco.

Entonces, un mejor método es verificar si la línea realmente contiene algún número y luego agregarlo, por ejemplo:

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

Si el archivo tiene un formato más complejo, considere usar expresiones regulares adecuadas, en lugar de [0-9].


1

Con un editor de texto, busque ^M(control-M o retorno de carro) al final de cada línea. Primero deberá eliminarlos y luego agregar el texto adicional al final de la línea.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. También puede lograr esto utilizando la técnica de referencia inversa.

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. También puedes usar con awk como este

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

-1

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

Hago esto con bastante frecuencia para agregar una coma al final de una salida para poder copiarla y pegarla fácilmente en una matriz de Python (o su idioma favorito)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.