POSIXY:
pattern='\(.\).*\1
.'
grep -x -- "$pattern" file
No funcionará si la línea comienza o termina con un carácter de byte no válido, si desea cubrir ese caso, puede agregar LC_ALL=C
, aunque LC_ALL=C
solo funciona con datos de caracteres de un solo byte.
perl6
parece ser la mejor herramienta, si la tiene en su caja:
$ printf '\ue7\u301 blah \u107\u327\n121\n1\n123\n' |
perl6 -ne '.say if m/^(.).*$0$/ || /^.$/'
ḉ blah ḉ
121
1
Aunque todavía se ahoga con caracteres no válidos.
Tenga en cuenta que perl6
alterará su texto convirtiéndolo en NFC
forma:
$ printf '\u0044\u0323\u0307\n' |
perl6 -pe '' |
perl -CI -ne 'printf "U+%04x\n", ord for split //'
U+1e0c
U+0307
U+000a
$ printf '\u0044\u0323\u0307\n' |
perl -pe '' |
perl -CI -ne 'printf "U+%04x\n", ord for split //'
U+0044
U+0323
U+0307
U+000a
Internamente, perl6
almacena la cadena en NFG
forma (soporte Normalization Form Grapheme
), que es una perl6
forma inventada de tratar correctamente los grafemas no precompuestos:
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.chars.say'
1
$ printf '\u0044\u0323\u0307\n' | perl6 -ne '.codes.say'
2
perl6
embargo, debe tenerse en cuenta que alterará el texto (gírelo a NFC (formulario de normalización "compuesto")).perl6
se almacena enNFG
forma (G
forGrapheme
), que es unaperl6
forma de tratar correctamente los grafemas no precompuestos.No grep pero awk:
Estos casos especiales se manejan:
Un FS vacío divide el registro en un solo personaje por campo en
gawk
,mawk
ybusybox
awk
(bytes, no caracteres de los dos últimos), pero no es estándar y no funciona en las implementaciones de laawk
deriva de la original por A, W y K como en BSD y unidades comerciales. Más portátil pero más para escribir:fuente
FS
como cadena vacía no es estándar, y no funcionará en algunaawk
implementación.awk 'length&&substr($0,1,1)==substr($0,length)'
(observe el argumento predeterminado delength
is$0
, y la acción predeterminada es{print $0}
)nawk
cual es casi tan malo :-)Ejemplo:
-x
es para la coincidencia exacta (coincidencia en toda la línea).\1
siendo una referencia al personaje capturado en\(.\)
. Agregamos un-e .
para cuidar el caso especial de una línea que contiene un solo carácter.Se supone que la entrada contiene texto válido en la configuración regional actual.
La coincidencia está en el carácter , no en el byte (esos é en UTF-8 son los dos bytes 0xc3 0xa9 por ejemplo), ni en el grupo de gráficos (no funcionaría si esos é se escribieran en su forma descompuesta con
e
seguido por U + 0301 combinando acento agudo, por ejemplo).Para trabajar en clústeres de gráficos, con un
grep
soporte-P
para PCRE:Eso supone que la descomposición es la misma para los dos grupos, por ejemplo, un
ḉ
expresado comoc
U+0301
U+0327
no coincidiría con uno expresado comoc
U+0327
U+0301
oć
(U+0107
)U+0327
oç
(U+00E7
)U+0301
o ḉ (U+1E09
). Para eso, deberías hacer la verificación en un formulario normalizado:fuente
perl6
,perl6 -ne '.say if m/^(.).*$0$/ || /^.$/'
debería hacer todos los trabajos por usted.Alternativa rápida a python2:
Ejemplo:
fuente