Importante: no debemos confundir las expresiones regulares con la sustitución de nombres de ficheros (globbing)
egrep t[^aeiouAEIOU][a-zA-Z]* tmp.txtla shell extiende los comodines y convierte este comando en:
egrep tmp.txt tmp.txt
grep y sed son dos comandos que usan REGEXP
grep [opciones] patrón [fichero...]
Opciones:
Si no especificamos fichero, grep usa la entrada estándar:
$ egrep '[Uu]nix'
unix
unix
Unix
Unix
Linux
Editor de flujo; permite realizar transformaciones básicas de un flujo de entrada (un fichero o una entrada desde una tubería)
Formato (para substituciones):
sed [opciones] 's/REGEXP/reemplazo/flag' [fichero]
Algunos comandos:
Algunas ociones:
Algunos flags:
Ejemplo: cambia, en el fichero amigos, todas las apariciones de pepe y paco por Pepe y Paco, respectivamente:
$ sed -e 's/pepe/Pepe/g' -e 's/paco/Paco/g' amigos (también sed 's/pepe/Pepe/g ; s/paco/Paco/g' amigos)
Ejemplo: cambia pepe por Pepe, pero sólo en las líneas que tengan Potamo
$ sed '/Potamo/s/pepe/Pepe/g' amigos
Ejemplo: muestra sólo las lineas que contengan jaime
$ sed -n '/jaime/p' amigos
Ejemplo: borra las lineas que contengan jaime
$ sed '/jaime/d' amigos
Ejemplo: cambia las lineas que contengan jaime por otra cosa
$ sed '/jaime/c\BORRADO' amigos
Ejemplo: inserta una línea, con la palabra 'APARICION', antes de las líneas que contengan jaime
$ sed '/jaime/i\APARICION' amigos
Ejemplo: reemplaza, en cada línea de fichero, la quinta ocurrencia de stop por STOP
$ sed 's/stop/STOP/5' fichero
Ejemplo: igual que antes pero guarda cada línea reemplazada en el fichero f2
$ sed 's/stop/STOP/5w f2' fichero
sed '3s/stop/STOP/g' (reemplaza sólo en la línea 3)
sed '3,10s/stop/STOP/g' (reemplaza de la línea 3 a la 10)
sed '3,$s/stop/STOP/g' (reemplaza de la línea 3 al final)
sed '!3s/stop/STOP/g' (reemplaza en todas las líneas menos la 3)
Ejemplo: reemplaza stop por <stop>
$ sed '3s/stop/<&>/g' fichero
Ejemplo: reemplazo desde la línea 1 hasta una línea que comience por END (o el final, si no hay ninguna)
$ cat file.sed
1,/^END/{
s/[Ll]inux/GNU\/Linux/g
s/samba/Samba/g
}
$ sed -f file.sed fichero
Para saber más:
o, simplemente, busca sed tutorial en google
La mayoría de los caracteres son tratados como literales:
. [ ] ^ $ * ( ) \
ER | concuerda con |
. | cualquier carácter |
[ ] | cualquiera de los caracteres entre corchetes, p.e. [abc] concuerda con a, b o c; [a-z] concuerda con cualquier letra minúscula |
[^ ] | cualquier carácter que no esté entre corchetes |
^ | principio de línea |
$ | final de línea |
* | 0 o más ocurrencias de la expresión regular anterior |
\( \) | permite agrupar ER |
\ | escapa un metacarácter |
Ejemplos:
ER | concuerda con |
a..c | cadena que empiece por a, seguida por dos caracteres y c: a00c, xaxxcxx, aacc,... |
0[abc]0 | cadenas que tengan un 0 seguido de un carácter a, b, o c y seguido de otro 0: 0a0, 00ab0b0, bc0c0,... |
0[^abc]0 | cadenas que tengan un 0 seguido de un carácter distinto a a, b, o c y seguido de otro 0 |
0[a-z]0 | cadenas que tengan un 0 seguido de una letra minúscula, y 0 |
^abc | líneas que empiecen por abc |
abc$ | líneas que terminen por abc |
ab*c | cadenas que empiecen por a, que continúen con 0 o más b, y una c: abc, ac, abbc, aaccab,...pero no cba o aaab |
b[cq]*e | cadenas que empiecen por b, que continúen con 0 o más c o q, y una e: be, bcce, bccqqee o bqqqce |
.* | cualquier cadena |
abc.* | cualquier cadena que empiece por abc |
0\(abc\)*0 | cadenas que tengan un 0 seguido de 0 o más ocurrencias de abc, y seguido de otro 0: 0abc0, 00, 0abcabc0,..., pero no 0ac0 o 0cba0 |
^#.*\.$ | línea que empiece por # y termine por . (notar que el segundo . está escapado por la \; la ER .* implica 0 o más caracteres cualquiera) |
Constructor | Propósito |
\{n\} | concuerda con exactamente n ocurrencias de la RE previa |
\{n,\} | concuerda con al menos n ocurrencias de la RE previa |
\{n, m\} | concuerda con entre n y m ocurrencias de la RE previa |
Ejemplos:
ER | concuerda con |
+ | una o más ocurrencias de la RE anterior |
? | cero o una ocurrencia de la RE anterior |
Además, \( \) y \{ \} se reemplazan por ( ) y { }
ER | concuerda con |
\n, \r, \t | LF, CR y tab (no siempre funcionan) |
[:space:] | caracteres en blanco ([ \t\n\r\f\v]) |
[:blank:] | espacio y tabulado |
[:alnum:] o \w | caracteres alfánuméricos (letras y números) |
[:digit:] | dígitos |
[:alpha:] | alfabéticos |
[:upper:] | mayúsculas |
[:lower:] | minúsculas |
[:xdigit:] | dígitos hexadecimales |
[:punct:] | signos de puntuación |
[:cntrl:] | caracteres de control |
[:graph:] | caracteres imprimibles (sin espacio) |
[:print:] | caracteres imprimibles (con espacio) |
\<, \> | inicio/fin de palabra |
\b | posición entre palabras |
\B | posición en medio de una palabra |
Ejemplos de uso con sed:
$ echo "abc1234def" | sed -r "s/[0-9]+/NUMERO/"
abcNUMEROdef
$ echo "abc1234def" | sed -r 's/[0-9]+/<&>/'
abc<1234>def
# En el siguiente ejemplo, notar que las ER intentan siempre reconocer la secuencia más larga posible
$ echo "000x111x222x333" | sed 's/x.*x/<&>/'
000<x111x222x>333
# Eliminar blancos a principio y al final de línea y sustituir más de un blanco seguido por uno solo
$ sed -r "s/^_+// ; s/_+$// ; s/__+/_/g" fich
# Pon los 4 primeros caracteres de cada línea al final de la misma
$ sed -r 's/^(.{4,4})(.*)/\2\1/' fich
# Cambia de minúsculas a mayúsculas la primera letra de cada palabra
$ sed -r 's/\<./\u&/g'
# Convierte DOS newlines (CR/LF) a formato Unix (LF)
$ sed 's/^M$//'4
# también funcionaría
$ sed 's/\r//'
Para más información: Regular-expressions.info
Administración de Sistemas e Redes <ASR.USC[at]gmail.com>
Tomás Fernández Pena <tf.pena[at]usc.es>
Última actualización: 30-09-15 17:44 por tomas
Curso de Administración de Sistemas y Redes por Tomás Fernández Pena se distribuye bajo la licencia Creative Commons Recoñecemento-Compartir baixo a mesma licenza. 3.0 España.
Trabajo original en persoal.citius.usc.es/tf.pena/ASR.