Ejemplos de Bash Sed

Bash Sed Examples



Bash le permite realizar el reemplazo de patrones usando expansión variable como ($ {var / pattern / replacement}). Y entonces, sed así (sed -e 's / patrón / reemplazo /'). Sin embargo, sed es más que reemplazar patrones en archivos de texto. Aquí redescubriremos sed, por ejemplo, con comandos y flujos de trabajo equivalentes para ayudar en las tareas del día a día.

Configuración para ejemplos sed

Aquí hay una guía rápida para configurar el ejemplo, que intentaré no exagerar.







palabrases un archivo de texto que contiene los números del 1 al 100. Si no está seguro del comando para crearlo, consulte la función Exportar para xargs en el comando Bash Export. Nunca se sabe que puede ser en su próxima entrevista de shell scripting.



bares un archivo de texto que contiene una sola línea -.



php antiguoes un archivo de texto que contiene líneas de PHP antiguo que se romperán en php7 o posterior. (Pista: ereg)





Tenga en cuenta que todas las funciones descritas anteriormente se pueden encontrar a continuación en la Nota final sobre las funciones para la configuración.

Ejemplos de sed con comandos equivalentes

En un entorno de línea de comandos, encontrará que hay más de una solución para una tarea determinada. Sin embargo, en su mayor parte, desea seguir el camino que ofrece la menor resistencia. Aquí hay una lista de ejemplos de comandos sed con los correspondientes comandos equivalentes, algunos de los cuales se tratarán en detalle a continuación.



1. Imprime una línea aleatoria (equivalente a sort -R - | head -1)

sed -norte '$ ((ALEATORIO% 100))pag'-

2.Imprima la última línea del archivo (equivalente al encabezado -1 -)

sed -norte '$ p'-

3. Imprima las primeras 10 líneas en un archivo (equivalente al encabezado -n 10 -)

sed '10q'-

4. Imprima la primera línea en un archivo (equivalente a tail -1 -)

sed -norte '1p'-

5. Eliminar todas las instancias de un carácter (equivalente a tr –delete '0' -, donde 0 es el carácter que queremos eliminar)

sed -Y 's / 0 // g'-

6. Convierta el archivo csv a tsv (equivalente a tr ‘,’ ‘ t’ -)

sed -Y 's /, / t / g'-

7.Añadir línea al archivo (equivalente a cat bar -)

sed '$a ---'-

8. Anteponer una línea al archivo (equivalente a cat - bar)

sed '1i ---'-

9. Imprima todas las líneas del archivo (equivalente a cat -)

sed -norte -Y 'pag'-

10. Imprima líneas que coincidan con un patrón (equivalente a grep -e '^ 1' -)

sed -norte -Y '/ ^ 1 / p'-

11. Elimine las líneas que coincidan con un patrón (equivalente a grep -v -e '^ 1' -)

sed -Y '/ ^ 1 / d'-

12. Obtenga el número de líneas en un archivo (equivalente a wc -l -)

sed -norte -Y '$='-

13. Escriba en un archivo en segundo plano (tee de comando equivalente)

sed 'en${1}'-

Ejemplo de uso de sed para implementar el comando tee

Justo encima, hay un ejemplo con la etiqueta Escribir en un archivo en segundo plano. Suena como el comando tee. Bueno, lo es. Aquí ampliaremos cómo implementar una función para reemplazar tee en bash usando sed.

Comandos

tee ()
{
prueba ${#} -eq 1 || regreso;
sed 'en${1}'-
}
principal()
teeesta;
gatoesta

principal

Producción

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Aquí verá dos listados de los números enteros del 1 al 10. El primero es del comando seq. El segundo lo obtenemos del gato del archivo escrito en tee. ¡Sé que es ridículo pero funciona!

Ejemplo de uso de sed para imprimir una línea aleatoria en un archivo

Supongamos que queremos imprimir una línea aleatoria en un archivo usando bash y un poco de sed. ¿Podemos hacerlo? ¡Si podemos! Así es cómo.

Implementar una función que

  1. Obtiene el número de líneas de un archivo, L
  2. Genera un número aleatorio entre 1 y L, R
  3. Imprime R

La función espera que la entrada se canalice desde el exterior.

Comandos

alguna linea()
{
funciónlc()
{
sed -norte -Y '$='-
};
funciónlínea de impresión()
{
sed -norte -Y '${1}pag'-
};
temperatura=$( mktemp );
gato-> $ {temp};
gato $ {temp} |línea de impresión $((ALEATORIO%$( gato $ {temp} |lc)+1 ));
rm $ {temp}
}

Uso de ejemplo (1)

seq 100 |_

Salida (1)

35

Uso de ejemplo (2)

rizo https://linuxhint.com/bash_cut_command/ --silencio |etiquetas de tira|alguna linea

Vea el ejemplo a continuación, usando sed para quitar etiquetas HTML. Tenga en cuenta que el ejemplo anterior a veces devuelve un espacio en blanco para las líneas vacías. Como ejercicio, se puede mejorar.

Usando sed para imprimir líneas en un archivo

Suponga que desea implementar una función en bash para imprimir una línea determinada en un archivo. Intentar imprimir una sola línea en un archivo usando un bucle en bash, head, tail o awk es demasiado trabajo para imprimir líneas en un archivo. Menos mal que hemos sed. La función resultante usando sed sería la siguiente.

Comandos

línea de impresión()
{
sed -norte '${1}pag'-
}

Ahora veamos qué sucede cuando usamos print-line en palabras.

Comandos

palabras|línea de impresión50

Producción

50

Bueno. Se ve bien, pero intentemos algo que parezca un poco menos trivial.

Comandos

declare -xfpalabras
declare -xflínea de impresión
seq 1 10$(palabras| WC -los ) | xargs-Iintento -c 'palabras | print-line {} '

Producción

1
11
21
31
41
51
61
71
81
91

Bueno. ¡Ahora eso es más parecido! Verá cómo se puede usar sed en un script bash para imprimir cualquier línea en un archivo.

Ejemplos de sed sin comandos equivalentes

En un entorno de línea de comandos, a veces el camino hacia una solución que ofrece la menor resistencia es el camino sed; de lo contrario, terminará haciendo más trabajo del requerido en primer lugar. Algunos comandos pueden aparecer a continuación.

Comando todas las líneas en un script de shell

sed -Y 's / ^ / # /'-
Eliminar la primera línea
sed -Y '1d'-
Borrarúltimolínea
sed -Y '$ d'-
Insertar una línea antes de las líneas que coinciden con un patrón
sed '/ 0 $ / i ---'-
Insertar una línea después de las líneas que coinciden con un patrón
sed '/0$/ ---'-
Eliminar las etiquetas html
sed -Y 's /†*.// g'-
Actualizar eregenantiguo código php para ejecutarenphp7 o posterior
sed 's / ereg ( ([^,] * ). ([^)] * ) ./ strpos ( 2, 1) / g'
Chequesi sedes anterior a una determinada versión
sed -Y 'v 4.5'-

Ejemplo sed versión ramificada en bash

Arriba en los ejemplos, hay una línea para verificar si sed es anterior a una determinada versión que podemos usar para implementar la ramificación de versiones en bash, lo cual creo que es más fácil que intentar implementar una función para comparar los números de versión de sed –version output . El único problema es que si hay una versión anterior de sed que no es compatible con el comando v, entonces estamos en problemas.

Comandos

test-sed-version-at-most() {
echo -norte | sed 'v${1}'-2>/dev/nulo
}
versión de prueba()
{
echo -norte 'Versión${1}. Bueno. Hazlo el ';
test-sed-version-at-most${1} && {
echo -norte 'viejo';
cierto
} || {
echo -norte 'nuevo'
};
echo ' camino.'
}
principal()
{
localv;
porven 4.{4,5};
hacer
versión de prueba$ {v};
hecho
}
principal

Producción

Versión4.4. Bueno. Hazlo a la antigua.
Versión4.5. Bueno. Hágalo de la nueva forma.

Tenga en cuenta que la versión de sed que se ejecuta en mi máquina al escribir estos caracteres es 4.4, lo que explicaría el resultado anterior. Además, al mismo tiempo, la última versión de gnu sed era 4.7, unos 3 años mayor que la que tengo. ¡Mi sed es viejo! De hecho, en sed 4.0.6, se agregó un parámetro al comando de versión, por lo que esta estrategia funciona para cualquiera, al menos, v4.0.6, lo cual es indulgente considerando que la versión fue lanzada a principios de 2003. Estás bien.

Hice un poco de investigación adicional, en realidad NOTICIAS leyendo el último código fuente. La versión 4.6 tiene una nueva característica, depuración, que descarga el script y anota las líneas de salida. Esto le permitiría traducir scripts sed generados por funciones en bash a forma canónica. ¡Frio! No olvide que necesita la versión sed de bifurcación en bash. Ahí es donde entra en juego este ejemplo de sed.

Ejemplo de función bash usando sed para quitar etiquetas HTML

En los ejemplos anteriores, hay una línea para eliminar las etiquetas HTML. Pongamos eso en una función bash y usémoslo para eliminar todas las etiquetas HTML del último artículo que escribí.

Comandos

etiquetas de tira()
{
sed -Y 's /†*.// g'-
}
rizo https://linuxhint.com/bash_cut_command/ --silencio |etiquetas de tira

No puedo decir que sea perfecto, pero al menos se puede leer en la terminal.

Ejemplos de sed con flujos de trabajo: flujo de trabajo de ejemplo: reemplace todo de forma segura usando find, grep y sed

Es seguro decir que los cambios realizados usando sed con la opción -i son irreversibles. Es decir, a menos que esté completamente seguro de qué texto se reemplazará, es probable que termine con un carácter menos de lo previsto. Por eso, en este ejemplo, usaremos sed en un flujo de trabajo para reemplazar de forma segura el texto en todos los archivos que ha seleccionado.

Flujo de trabajo

  1. encontrar
  2. sujeción
  3. sed
encontrar

Aquí seleccionará los archivos que estarán sujetos a reemplazo. Sugiero usar un comando a lo largo de estas líneas:

encontrar -escribeF-nombre | sujeción -v-Y| xargs-I ...

Por ejemplo, es posible que desee limitar los archivos para reemplazar los archivos PHP excluyendo los directorios del repositorio git de la siguiente manera.

encontrar -escribeF-nombre*.php| sujeción -v -Y '.ir' | xargs -I...

Lea más sobre el comando xargs en bash.

sujeción

A continuación, intentaremos hacer coincidir some_pattern en los archivos seleccionados de la siguiente manera. Tenga en cuenta que, dado que estamos usando la opción -o para grep, la salida solo mostrará una cadena coincidente, si la hubiera.

encontrar -escribeF-nombre*.php| sujeción -v -Y '.ir' |
xargs -I sujeción -Yalgún_patrón-o

El comando anterior debería devolver una lista de cadenas que coincidan con some_pattern.

sed

Finalmente, queremos reemplazar todas las cadenas que coincidan con some_pattern. Para hacer eso, necesitamos convertir grep en sed de la siguiente manera.

encontrar -escribeF-nombre*.php| sujeción -v -Y '.ir' |
xargs -I sed -I -Ys/algún_patrón/reemplazo/gramo

El comando grep se convierte en sed -i y se elimina la opción -o. Y ahí lo tienes.

Ahora puede verificar qué cadenas se reemplazarán en sed de antemano en lugar de probar su suerte.

Notas finales sobre las opciones utilizadas en los ejemplos

A continuación, se muestra una lista de opciones utilizadas en los ejemplos de sed que se analizan brevemente.

Opción Descripción
-I Edite en su lugar. Si la entrada es un archivo (no canalizado), el resultado de las expresiones sobrescribirá el contenido del archivo.

Sed acepta uno

p. ej.) sed -n…

-Y -e significa expresión. Su parámetro es una expresión en el lenguaje sed.

Sed acepta muchos

p. ej.) sed -e'expr1 '-e'expr2'

-norte Oculta la línea no afectada por la expresión. Es decir, si la expresión es una declaración de impresión en el lenguaje sed, las líneas no incluidas en la declaración de impresión no se incluirán en la salida.

p. ej.) sed -n…

Para obtener más información sobre las opciones de sed disponibles, consulte sed –help

Notas finales sobre el uso de comandos equivalentes en ejemplos

Las siguientes utilidades de línea de comandos se incluyen en los ejemplos de sed con comandos equivalentes.

  • clasificar
  • cabeza
  • cola
  • sujeción
  • gato
  • NS
  • tee

Nota al final al final: en comandos equivalentes de ejemplo

En caso de que se esté preguntando qué sucede con el carácter - en el ejemplo, esta nota es para usted. Agregué un carácter - después de la mayoría de los comandos en los ejemplos para insinuar que esperamos que la entrada se reciba a través de una tubería. Es decir,

gatoalgún archivo| clasificar -R-| cabeza -1

Sin embargo, cuando el comando en el lado izquierdo de la tubería está presente, podemos omitir la sugerencia de la siguiente manera.

gatoalgún archivo| clasificar -R | cabeza -1

Eso es lo que sucedía con el carácter - después de los comandos en los ejemplos.

Notas finales sobre funciones para la configuración

En caso de que esté buscando, aquí hay funciones para la configuración de los ejemplos anteriores. La salida obtenida usando declare -f. Lea más sobre el comando declare en bash para conocer más usos.

Comandos

palabras()
{
seq 100
}
bar()
{
echo ---
}
php antiguo()
{
echo 'ereg ($ UA,' Bottybot ')'
}

Línea de fondo

Disfruté escribiendo ejemplos de Bash sed e incluso aprendí algunos trucos adicionales en el camino. Sed es una poderosa utilidad de línea de comandos y un lenguaje expresivo para manipular archivos de texto. Si te gustó aprender sobre sed, no te preocupes, todavía hay mucho más por tocar. Sed on.