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
12
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
- Obtiene el número de líneas de un archivo, L
- Genera un número aleatorio entre 1 y L, R
- 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)
35Uso de ejemplo (2)
curl https: // linuxhint.com / bash_cut_command / --silent | strip-tags | alguna lineaVea 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 50Producción
50Okey. Se ve bien, pero intentemos algo que parezca un poco menos trivial.
Comandos
declarar -xf palabrasdeclarar -xf print-line
seq 1 10 $ (palabras | wc -l) | xargs -i bash -c "palabras | línea de impresión "
Producción
111
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
- encontrar
- grep
- 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.
- clasificar
- cabeza
- cola
- grep
- gato
- Tr
- 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,
cat some-file | sort -R - | cabeza -1Sin 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 -1Eso 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.