sed

Ejemplos de Bash Sed

Ejemplos de Bash Sed
Bash le permite realizar el reemplazo de patrones utilizando una expansión variable como ($ var / pattern / replacement). Y entonces, sed así (sed -e 's / pattern / replacement /'). 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 trataré de no exagerar.

"Palabras" es 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.

"Barra" es un archivo de texto que contiene una sola línea -.

"Old-php" es 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 de 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 comandos equivalentes correspondientes, donde algunos se cubrirán en detalle a continuación.

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

sed -n "$ ((RANDOM% 100)) p" -

2.Imprime la última línea en el archivo (equivalente a encabezado -1 -)

sed -n '$ p' -

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

sed '10q' -

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

sed -n '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 -e 's / 0 // g' -

6. Convertir archivo csv a tsv (equivalente a tr ', "\ t' -)

sed -e 's /, / \ t / g' -

7.Agregar línea al archivo (equivalente a cat bar -)

sed '$ a ---' -

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

sed '1i ---' -

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

sed -n -e 'p' -

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

sed -n -e '/ ^ 1 / p' -

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

sed -e '/ ^ 1 / d' -

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

sed -n -e '$ =' -

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

sed "w $ 1" -

Ejemplo usando sed para implementar el comando tee

Justo encima, hay un ejemplo etiquetado Escribir en un archivo en segundo plano. Tipo de sonidos 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 "w $ 1" -

principal ()

seq 10 | tee diez;
gato diez

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 línea ()

función lc ()

sed -n -e '$ =' -
;
función print-line ()

sed -n -e "$ 1 p" -
;
temp = $ (mktemp);
gato -> $ temp;
cat $ temp | línea de impresión $ ((RANDOM% $ (cat $ temp | lc) + 1));
rm $ temp

Uso de ejemplo (1)

seq 100 | _

Salida (1)

35

Uso de ejemplo (2)

curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags | alguna linea

Vea el ejemplo a continuación, usando sed para quitar etiquetas HTML. Tenga en cuenta que el ejemplo anterior a veces devuelve 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 -n "$ 1 p" -

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

Comandos

palabras | línea de impresión 50

Producción

50

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

Comandos

declarar -xf palabras
declarar -xf print-line
seq 1 10 $ (palabras | wc -l) | xargs -i bash -c "palabras | línea de impresión "

Producción

1
11
21
31
41
51
61
71
81
91

Okey. 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 -e 's / ^ / # /' -
Eliminar la primera línea
sed -e '1d' -
Eliminar la última línea
sed -e '$ 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 -e 's /<[^>] *.//gramo' -
Actualice ereg en el código php antiguo para ejecutarlo en php7 o posterior
sed 's / ereg (\ ([^,] * \).\ ([^)] * \)./ strpos (\ 2, \ 1) / g '
Compruebe si sed es anterior a una determinada versión
sed -e '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, que 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. Ese único error es que si hay una versión anterior de sed que no admite el comando v, entonces estamos en problemas.

Comandos

test-sed-version-at-most ()
echo -n | sed "v $ 1" - 2> / dev / null

versión de prueba ()

echo -n "Versión $ 1. Okey. Hágalo el ";
test-sed-version-at-most $ 1 &&
echo -n "antiguo";
cierto
||
echo -n "nuevo"
;
echo "camino."

principal ()

local v;
para v en 4.4,5;
hacer
versión de prueba $ v;
hecho

principal

Producción

Versión 4.4. Okey. Hazlo a la antigua.
Versión 4.5. Okey. Hazlo de la nueva manera.

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 fue 4.7, unos 3 años mayor que el 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 teniendo en cuenta que la versión se lanzó a principios de 2003. Eres bueno.

Hice un poco más de investigación, en realidad NOTICIAS leyendo el último código fuente. Versión 4.6 tiene una nueva característica, -debug que vuelca 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. Fresco! Simplemente no olvide que necesita la versión sed que se bifurca 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

strip-tags ()

sed -e 's /<[^>] *.//gramo' -

curl https: // linuxhint.com / bash_cut_command / --silent | 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. Es por eso que 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. grep
  3. sed
encontrar

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

find -type f -name | grep -v -e | 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.

buscar -tipo f -nombre \ *.php | grep -v -e '.git '| xargs -i…

Leer más sobre el comando xargs en bash.

grep

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 hay.

buscar -tipo f -nombre \ *.php | grep -v -e '.git '|
xargs -i grep -e algú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.

buscar -tipo f -nombre \ *.php | grep -v -e '.git '|
xargs -i sed -i -e s / algún_patrón / reemplazo / g

El comando grep se convierte en sed -i y la opción -o se elimina. 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

Aquí hay una lista de opciones utilizadas en los ejemplos sed discutidos brevemente.

Opción Descripción
-I Editar en el 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…

-mi -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 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.

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,

cat some-file | sort -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.

cat some-file | sort -R | cabeza -1

Eso es lo que estaba sucediendo 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é mirando, 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 más usos.

Comandos

palabras ()

seq 100

bar ()

eco ---

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 en.

Cómo descargar y jugar Sid Meier's Civilization VI en Linux
Introducción al juego Civilization 6 es una versión moderna del concepto clásico introducido en la serie de juegos Age of Empires. La idea era bastant...
Cómo instalar y jugar a Doom en Linux
Introducción a Doom La serie Doom se originó en los años 90 después del lanzamiento del Doom original. Fue un éxito instantáneo y, desde ese momento e...
Vulkan para usuarios de Linux
Con cada nueva generación de tarjetas gráficas, vemos que los desarrolladores de juegos superan los límites de la fidelidad gráfica y se acercan un pa...