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 sed
informes 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 sed
en 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 sed
usa?
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
sed
lee 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 stdin
si 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!
sed
por 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 p
o un d
comando *, sed
siempre 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 sed
junto con el -n
interruptor:
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
, d
y s
los comandos, que son los comandos que se cubren en esta respuesta.
Selección de lineas
sed
puede 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 sed
junto con el -n
interruptor 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
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
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 s
comando 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 s
comando; 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 sed
secuencias específicas con un significado especial; <pattern_flags>
es una lista de banderas que modifican el comportamiento de <pattern>
.
sed
Secuencias 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 -n
interruptor en sed
la 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
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.