¿Qué es sed y para qué se utiliza?

20

He estado viendo muchas cosas sedúltimamente, y considero que es un comando bastante confuso. Las páginas de manual no fueron particularmente útiles, pero sé que se puede usar para analizar la salida de otros comandos.

¿Qué es exactamente sedy para qué sirve? Estoy buscando una respuesta integral que cubra qué sedes, para qué se usa comúnmente y algunos ejemplos básicos / sintaxis.

Seth
fuente
3
Desde la página de manual de Sed:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89
Este debería ser un buen lugar para comenzar una respuesta integral: en.wikipedia.org/wiki/Sed
saji89
1
info sedtiene mucho más man sed. Entonces, adentro /usr/share/doc/sed, hay sedfaq.txt.gz.

Respuestas:

20

En uso básico se usa para 'buscar y reemplazar' con cadenas.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

devoluciones

"The quick brown fox jumps over the lazy cat"

Sed realmente brilla cuando se usan expresiones regulares con él.

Es posible que desee echar un vistazo a este artículo sobre sed, es bastante completo.

recatado
fuente
5

Definiciones

Unix System V: una guía práctica , libro de Mark Sobell:

La utilidad sed es un editor por lotes (no interactivo). Los comandos sed generalmente se almacenan en un archivo de script. . .aunque puede dar comandos sed simples desde la línea de comandos. . .

Página de manual para sed (GNU sed) 4.2.2:

Sed es un editor de stream. Se utiliza un editor de flujo para realizar transformaciones de texto básicas en un flujo de entrada (un archivo o entrada de una tubería).

Mi definición informal:

Sed(abreviatura de editor de flujo ) es una utilidad de procesamiento de texto que se desarrolló en el momento en que el texto se procesó una línea a la vez, pero sigue siendo una de las utilidades Unix / Linux más potentes; Al mismo tiempo, es una forma de lenguaje de secuencias de comandos, diseñado específicamente para procesar texto.

Usos

Como sugieren las definiciones, sedse utiliza para procesar líneas de texto por lotes, archivos de texto y secuencias de texto canalizadas. Con mayor frecuencia se usa para reemplazar y eliminar texto:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Sin embargo, también se puede usar para imitar el comportamiento de otros comandos. Por ejemplo,

  • para imitar dmesg | head -n 3(imprimir las primeras 3 líneas), podemos hacer dmesg | sed -n 1,3p.
  • para imitar dmesg | grep 'wlan0'(buscando una cadena), podemos hacerdmesg | sed -n '/wlan0/p'
  • Elemento de la lista

La gran ventaja que sedtiene sobre otras utilidades de procesamiento de texto es la -ibandera, lo que significa que no solo podemos enviar el texto editado a la pantalla, sino también guardar la edición en el archivo original. awklos sabores, por el contrario, solo tienen esa característica en la GNU awkversión.

sedpuede recibir información en la línea de comando, con múltiples patrones separados por punto y coma ( ;) o desde un archivo de script especificado después de la -fmarca, por ejemplocat someTextfile.txt | sed -f myScript.sed

Aplicaciones y ejemplos de Sed

Sergiy Kolodyazhnyy
fuente
1

Esta respuesta es un trabajo en progreso: se pierden más ejemplos sobre el comando susbstitute


¿Qué es sed?

sed = Stream EDitor

La descripción en la página del manual para los sedinformes GNU 4.2.2:

Sed es un editor de stream. Un editor de flujo se utiliza para realizar transformaciones de texto básicas en un flujo de entrada (un archivo o entrada de una tubería). Si bien, de alguna manera, es similar a un editor que permite ediciones con guiones (como ed), sed funciona al hacer un solo paso sobre las entradas y, en consecuencia, es más eficiente. Pero es la capacidad de sed para filtrar texto en una tubería lo que lo distingue particularmente de otros tipos de editores.

La descripción en la página de GNU seden gnu.org informa:

sed (editor de flujo) no es un editor de texto interactivo. En cambio, se usa para filtrar texto, es decir, toma entrada de texto, realiza alguna operación (o conjunto de operaciones) en él y genera el texto modificado. sed se usa generalmente para extraer parte de un archivo mediante la coincidencia de patrones o la sustitución de múltiples ocurrencias de una cadena dentro de un archivo.

¿Para qué se sedusa?

Se puede usar para realizar modificaciones complejas en los flujos de datos (generalmente texto, pero también se puede usar para modificar datos binarios).

Entre los casos más comunes de uso hay:

  • Impresión / eliminación selectiva de líneas de un archivo de texto utilizando expresiones regulares básicas / extendidas
  • Reemplazo global de cadenas en un archivo de texto usando expresiones regulares básicas / extendidas
  • Reemplazo selectivo de cadenas en un archivo de texto usando expresiones regulares básicas / extendidas

Estos son los casos de uso cubiertos en esta respuesta.

Uso

sedlee la entrada de un archivo almacenado en el sistema de archivos si se especifica un nombre de archivo en los argumentos de la línea de comandos durante su invocación, o stdinsi no se especifica ningún nombre de archivo.

Invocación mínima usando un archivo almacenado en el sistema de archivos:

sed '' file

Invocación mínima usando stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

¡Hola Mundo!

sedpor defecto lee el archivo de entrada línea por línea; lee una línea, elimina la nueva línea final de la línea y coloca la línea procesada en un "espacio de patrón"; finalmente, ejecuta los comandos enumerados en el contenido actual del espacio del patrón y lee una nueva línea del archivo de entrada.

Cuando no se especifica ningún comando o cuando se especifica un po un dcomando *, sedsiempre imprimirá el contenido actual del espacio del patrón seguido de una nueva línea en cada iteración, independientemente de:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Para evitar esto, se puede invocar sedjunto con el -ninterruptor:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Hablando sólo en los p, dy slos comandos, que son los comandos que se cubren en esta respuesta.

Selección de lineas

sedpuede procesar todo el archivo de entrada o procesar solo las líneas seleccionadas del archivo de entrada; la selección de las líneas del archivo de entrada a procesar se realiza especificando "direcciones"; una dirección puede ser (entre otras cosas) un número de línea o un patrón; Se pueden seleccionar rangos de líneas especificando rangos de direcciones.

Las posibles combinaciones de direcciones son:

  • <N>(donde <N>hay un número): los siguientes comandos / comandos se ejecutarán solo en el número de línea <N>;
  • <N>,<M>(donde <N>y <M>son dos números, <N>> <M>): los siguientes comandos / comandos se ejecutarán en líneas que van desde el número <N>de línea hasta el número de línea <M>inclusive;
  • /<pattern>/(donde <pattern>es una expresión regular básica o extendida): los siguientes comandos / comandos se ejecutarán solo en líneas que contienen una ocurrencia de <pattern>;
  • /<pattern1>/,/<pattern2>/(donde <pattern1>y <pattern2>son básicas o extendida expresiones regulares): el siguiente comando / comandos se ejecuta en las líneas que van desde la primera línea que contiene una aparición de <pattern1>a la línea siguiente que contiene una ocurrencia de <pattern2>, varias veces en caso de múltiples ordenado <pattern1>- <pattern2>ocurrencias;
  • <N>,/pattern/(donde <N>es un número y <pattern>es una expresión regular básica o extendida): los siguientes comandos / comandos se ejecutarán en líneas que van desde el número de línea <N>hasta la primera línea que contiene una ocurrencia de <pattern>;
  • /pattern/,<N>(donde <pattern>es una expresión regular básica o extendida y <N>es un número): los siguientes comandos / comandos se ejecutarán en líneas que van desde la primera línea que contiene una ocurrencia <pattern>hasta el número de línea <N>;

La selección realizada para imprimir, eliminar o realizar sustituciones en rangos de líneas siempre incluirá las líneas que coincidan con las direcciones especificadas; además, la selección realizada para imprimir, eliminar o realizar sustituciones en rangos de líneas que usan patrones es perezosa y global (es decir, cada rango afectado siempre será el más pequeño posible y se verán afectados múltiples rangos).

Al imprimir rangos de líneas o imprimir solo líneas en las que se ha realizado una sustitución, es necesario invocar sedjunto con el -ninterruptor para evitar que las líneas que coinciden con el criterio se impriman dos veces (esto sucede solo cuando se imprimen rangos de líneas) y en orden para evitar que las líneas no coincidan con el criterio que se imprimirá independientemente.

Una selección de líneas a procesar debe ser seguida por un comando o por múltiples comandos separados por punto y coma agrupados usando llaves.

Comandos: imprimir, borrar

Los comandos utilizados para imprimir o eliminar una selección son, respectivamente:

  • p: imprime líneas que coinciden con la dirección especificada / rango de direcciones;
  • d: elimina líneas que coinciden con la dirección / rango de direcciones especificado;

Cuando uno de estos comandos no está precedido por una dirección / selección, el comando se ejecuta globalmente, es decir, en cada línea del archivo de entrada.

Ejemplos: imprimir, borrar

Impresión / eliminación de líneas que especifican direcciones numéricas:

Archivo de muestra:

line1
line2
line3
line4
line5
  • Línea de impresión <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Borrando línea <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Línea de impresión <N>a <M>inclusiva:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Eliminar línea <N>a <M>inclusivo:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Impresión / eliminación de líneas que especifican patrones:

Archivo de muestra:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Líneas de impresión coincidentes <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Eliminar líneas que coinciden <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Imprimir líneas desde la coincidencia de línea <pattern1>hasta la coincidencia de línea <pattern2>inclusive:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Eliminar líneas de la línea que coincide <pattern1>con la línea que <pattern2>incluye:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Comando: sustituto

El comando utilizado para realizar una sustitución en una selección es:

  • s: sustituye líneas que coinciden con la dirección especificada / rango de direcciones;

Cuando este comando no está precedido por una dirección / selección, el comando se ejecuta globalmente, es decir, en cada línea del archivo de entrada.

La sintaxis del scomando es:

s/<pattern>/<replacement_string>/<pattern_flags>

Las barras son "delimitadores"; que se utilizan para delimitar el <pattern>, <replacement_string>y <pattern_flags>secciones;

El delimitador es siempre el carácter que sigue inmediatamente al scomando; se puede establecer en cualquier otro carácter, por ejemplo |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>es una expresión regular básica o extendida; <replacement_string>es una cadena fija que puede incluir sedsecuencias específicas con un significado especial; <pattern_flags>es una lista de banderas que modifican el comportamiento de <pattern>.

sedSecuencias específicas más comunes con un significado especial:

  • &: referencia inversa reemplazada por la cadena que coincide con <pattern>;
  • \<N>(donde <N>es un número): referencia inversa reemplazada con el <N>grupo capturado en <pattern>;

Banderas más comunes:

  • g: obliga <pattern>a coincidir globalmente, es decir, varias veces en cada línea;
  • i: obliga <pattern>a coincidir entre mayúsculas y minúsculas;
  • p: imprime líneas en las que se ha realizado una sustitución una vez más (útil cuando se utiliza el -ninterruptor en sedla invocación para imprimir solo las líneas en las que se ha realizado una sustitución);

Ejemplos: sustituto

Archivo de muestra:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • Reemplazar la primera aparición de <pattern>with <replacement_string>en cada línea:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • Reemplazar todas las ocurrencias de <pattern>with <replacement_string>en cada línea:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • Seleccionando solo líneas que comienzan con <pattern1>y reemplazando todas las ocurrencias de <pattern2>con <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • Seleccionando solo líneas que terminan con <pattern1>y reemplazando todas las ocurrencias de <pattern2>con <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
kos
fuente