Comando Linux sed

Linux 命令大全Manual completo de comandos de Linux

El comando Linux sed se utiliza para procesar archivos de texto mediante scripts.

sed puede procesar y editar archivos de texto según las instrucciones del script.

Sed se utiliza principalmente para editar automáticamente uno o más archivos, simplificar operaciones repetitivas en archivos y escribir programas de conversión, etc.

Sintaxis

sed [-hnV][-e<script>][-f<script文件>][文本文件]

Descripción de parámetros:

  • -e<script> o --expression=<script> Procesa el archivo de texto de entrada con el script especificado en la opción.
  • -f<archivo de script> o --file=<archivo de script> Procesa el archivo de texto de entrada con el archivo de script especificado en la opción.
  • -h o --help Muestra la ayuda.
  • -n o --quiet o --silent Muestra solo los resultados después del procesamiento del script.
  • -V o --version Muestra la información de versión.

Descripción de acciones:

  • a : Agregar, después de 'a' se puede indicar una cadena, y estas cadenas aparecerán en una nueva línea (la siguiente línea actual).
  • c : Reemplazar, después de 'c' se puede indicar una cadena, estas cadenas pueden reemplazar las líneas entre n1 y n2.
  • d : Eliminar, como es eliminación, normalmente después de 'd' no se añade nada.
  • i : Insertar, después de 'i' se puede indicar una cadena, y estas cadenas aparecerán en una nueva línea (la línea anterior actual).
  • p : Imprimir, es decir, imprimir los datos seleccionados. Normalmente p se ejecuta junto con el parámetro sed -n.
  • s : Reemplazar, ¡puede realizar la sustitución directamente! Normalmente esta acción s se puede combinar con expresiones regulares. Por ejemplo, 1,20s/old/new/g.

Ejemplos

Primero creamos untestfilearchivo, con el siguiente contenido:

$ cat testfile #查看testfile 中的内容  
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
Google
Taobao
Ejemplo
Tesetfile
Wiki

EntestfileAgregue una línea después de la cuarta línea del archivo y envíe el resultado a la salida estándar; ingrese el siguiente comando en el símbolo del sistema:

sed -e 4a\newLine testfile 

Usandosedel comando, el resultado de salida es el siguiente:

$ sed -e 4a\newLine testfile 
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 
newLine
Google
Taobao
Ejemplo
Tesetfile
Wiki

Agregar/Eliminar por líneas

va atestfileEnumere el contenido e imprima los números de línea; al mismo tiempo, elimine las líneas 2 a 5.

$ nl testfile | sed '2,5d'
     1  HELLO LINUX!  
     6  Taobao
     7  Ejemplo
     8  Tesetfile
     9  Wiki

La acción de sed es2,5d, esedsignifica eliminar. Debido a que se eliminaron las líneas 2-5, los datos mostrados ya no contienen las líneas 2-5. Además, originalmente se debería ejecutar sed -e, pero sin -e también se puede. También se debe tener en cuenta que las acciones que siguen a sed deben'...'encerrarse entre dos comillas simples.

Solo eliminar la línea 2:

$ nl testfile | sed '2d' 
     1  HELLO LINUX!  
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Ejemplo
     8  Tesetfile
     9  Wiki

Para eliminar desde la línea 3 hasta la última:

$ nl testfile | sed '3,$d' 
     1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  

Después de la segunda línea (es decir, agregar en la tercera línea) añadedrink tea?el texto:

$ nl testfile | sed '2a drink tea'
     1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  
drink tea
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Ejemplo
     8  Tesetfile
     9  Wiki

Si es antes de la segunda línea, el comando es el siguiente:

$ nl testfile | sed '2i drink tea' 
     1  HELLO LINUX!  
drink tea
     2  Linux is a free unix-type opterating system.  
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Ejemplo
     8  Tesetfile
     9  Wiki

Si se quieren agregar más de dos líneas, después de la segunda línea se añaden dos líneas de texto, por ejemploDrink tea or .....ydrink beer?

$ nl testfile | sed '2a Drink tea or ......\
drink beer ?'

1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  
Drink tea or ......
drink beer ?
     3  This is a linux testfile!  
     4  Linux test 
     5  Google
     6  Taobao
     7  Ejemplo
     8  Tesetfile
     9  Wiki

Entre cada línea se debe usar una barra invertida\para marcar la nueva línea. En el ejemplo anterior, podemos notar que al final de la primera línea se encuentra\presente.

Reemplazo y visualización por líneas

¿Se puede reemplazar el contenido de las líneas2-5 conNo 2-5 number?

$ nl testfile | sed '2,5c No 2-5 number'
     1  HELLO LINUX!  
No 2-5 number
     6  Taobao
     7  Ejemplo
     8  Tesetfile
     9  Wiki

De esta manera podemos reemplazar líneas completas de datos.

Solo muestra las líneas 5-7 del archivo testfile:

$ nl testfile | sed -n '5,7p'
     5  Google
     6  Taobao
     7  Ejemplo

Mediante la función de visualización por líneas de sed, se pueden seleccionar y mostrar ciertos números de línea dentro de un archivo.

Buscar y mostrar datos

Busque en testfile las líneas que contienenoola palabra clave:

$ nl testfile | sed -n '/oo/p'
     5  Google
     7  Ejemplo

Si se encuentra root, además de mostrar todas las líneas, también se mostrarán las líneas coincidentes.

Buscar y eliminar datos

Elimina todas las líneas de testfile que contenganooy muestra las otras líneas.

$ nl testfile | sed  '/oo/d'
     1  HELLO LINUX!  
     2  Linux is a free unix-type opterating system.  
     3  This is a linux testfile!  
     4  Linux test 
     6  Taobao
     8  Tesetfile
     9  Wiki

Buscar datos y ejecutar comandos

Busca en testfile y encuentraoola línea correspondiente, ejecuta un grupo de comandos entre llaves; cada comando se separa con punto y coma; aquíooreemplaza conkk, y luego muestra esta línea:

$ nl testfile | sed -n '/oo/{s/oo/kk/;p;q}'  
     5  Gkkgle

El últimoqes salir.

Búsqueda y reemplazo de datos

Además del modo de procesamiento de líneas completas, sed también puede realizar búsqueda y reemplazo parcial de datos tomando como unidad la línea.

La búsqueda y reemplazo de sed es similar alvicomando vi; el formato de sintaxis es el siguiente:

sed 's/要被取代的字串/新的字串/g'
Reemplace la primera aparición de 'oo' en cada línea del archivo testfile con la cadena 'kk' y luego envíe el contenido del archivo a la salida estándar:
sed -e 's/oo/kk/' testfile

gEl identificador indica búsqueda y reemplazo global, de modo que sed reemplace todas las cadenas coincidentes en el archivo. El contenido modificado se enviará a la salida estándar y no se modificará el archivo original:

sed -e 's/oo/kk/g' testfile

La opciónihace que sed modifique el archivo:

sed -i 's/oo/kk/g' testfile

Realice operaciones por lotes en el directorio actual sobre los archivos que comiencentestcon el prefijo:

sed -i 's/oo/kk/g' ./test*

A continuación, usamos /sbin/ifconfig para consultar la IP:

$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....

La IP de esta máquina es 192.168.1.100.

Elimine la parte anterior a la IP:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

A continuación, se elimina la parte posterior, es decir:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0。

Elimine la parte posterior a la IP:

$ /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

Edición múltiple

Un comando sed que elimina los datos desde la tercera línea hasta el final de testfile y reemplaza HELLO por EJEMPLO:

$ nl testfile | sed -e '3,$d' -e 's/HELLO/EJEMPLO/'
     1  EJEMPLO LINUX!  
     2  Linux is a free unix-type opterating system.  

-e indica edición múltiple. El primer comando de edición elimina los datos de la tercera línea hasta el final de testfile, y el segundo comando busca HELLO y lo reemplaza por EJEMPLO.

Modificar directamente el contenido del archivo (acción peligrosa)

sed puede modificar directamente el contenido del archivo, sin necesidad de usar comandos de tubería o redirección de flujo de datos. Sin embargo, como esta acción modificará directamente el archivo original, ¡por favor no pruebes casualmente con la configuración del sistema! Sigamos usando el archivo regular_express.txt para probar.

El contenido del archivo regular_express.txt es el siguiente:

$ cat regular_express.txt 
ejemplo.
google.
taobao.
facebook.
zhihu-
weibo-

Use sed para cambiar el '.' al final de cada línea en regular_express.txt por '!'.

$ sed -i 's/\.$/\!/g' regular_express.txt
$ cat regular_express.txt 
ejemplo!
google!
taobao!
facebook!
zhihu-
weibo-
:q:q

Use sed para agregar directamente al final de regular_express.txt# This is a test:

$ sed -i '$a # This is a test' regular_express.txt
$ cat regular_express.txt 
ejemplo!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test

Dado que $ representa la última línea y la acción 'a' es agregar, por lo tanto, se agrega al final del archivo# This is a test!

La opción -i de sed-ipuede modificar directamente el contenido del archivo. ¡Esta función es muy útil! Por ejemplo, si tienes un archivo de un millón de líneas y quieres agregar cierto texto en la línea 100, usar vim podría volverte loco, porque el archivo es demasiado grande. Entonces, ¿qué hacer? ¡Usa sed! Con la función de modificación/reemplazo directo de sed, ni siquiera necesitas usar vim para editarlo.

Linux 命令大全Manual completo de comandos de Linux

Otras extensiones