Necesito identificar la posición de un personaje en una cadena usando el comando grep.
Ejemplo, la cadena es RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
¿Cómo encuentro la posición de |
en la cadena dada?
text-processing
grep
string
user82782
fuente
fuente
Respuestas:
Puede usar
-b
para obtener el desplazamiento de bytes, que es lo mismo que la posición para texto simple (pero no para UTF-8 o similar).En lo anterior, uso el
-a
interruptor para decirle a grep que use la entrada como texto; necesario cuando se opera en archivos binarios, y el-o
interruptor para generar solo los caracteres coincidentes.Si solo desea la posición, puede usar grep para extraer solo la posición:
Si obtiene resultados extraños, verifique si grep tiene colores habilitados. Puede deshabilitar los colores pasando
--colors=never
a grep, o prefijando el comando grep con un\
(que deshabilitará cualquier alias), por ejemplo:Para una cadena que devuelve múltiples coincidencias, canalice
head -n1
para obtener la primera coincidencia.Tenga en cuenta que uso ambos en lo anterior, y tenga en cuenta que este último no funcionará si grep está "aliasado" a través de un ejecutable (script u otro), solo cuando use alias.
fuente
2
;)^
:)0:|
como salida, porque 0 es la posición de byte del comienzo de la línea donde|
se encuentra.grep (GNU grep) 2.27
. ¿Estás quizás usando OS X?Tratar:
salida:
Esto le dará la posición con índice basado-1.
fuente
printf '%s\n' '|' | grep -o . | grep -n '|'
impresiones1
, no0
como se esperaba.Si está utilizando el shell bash , puede utilizar operaciones puramente integradas sin la necesidad de generar procesos externos como grep o awk :
Utiliza una expansión de parámetros para eliminar todas las ocurrencias de
|
seguimientos de cualquier cadena y guardarla en una variable temporal. Es solo una cuestión de medir la longitud de la variable temporal para obtener el índice|
.Tenga en cuenta que
if
está comprobando si|
existe en absoluto en la cadena original. Si no es así, la variable temporal será la misma que la original.Tenga en cuenta también que esto proporciona un índice de base cero
|
que generalmente es útil cuando se indexan cadenas bash. Sin embargo, si necesita el índice basado en uno, puede hacer esto:fuente
Puede usar la
index
función de awk para devolver la posición en los caracteres donde se produce la coincidencia:Si no le importa usar la
index
función de Perl , esto maneja informar cero, una o más ocurrencias de un personaje:Solo para facilitar la lectura, la tubería se ha dividido en dos líneas.
Siempre que se encuentre el carácter objetivo,
index
devuelve un valor positivo basado en cero (0). Por lo tanto, la cadena "abc | xyz | 123456 | zzz |" cuando se analiza devuelve las posiciones 0, 4, 8, 15 y 19.fuente
RAMSITALSKHMAN|1|223333
También podemos hacerlo usando "expr match" o "expr index"
expr match $ string $ substring donde $ substring es un RE.
Y arriba le dará la posición porque devuelve la longitud de la subcadena coincidente.
Pero para ser más específico para el índice de búsqueda:
fuente
awk
soluciones pueden modificarse trivialmente para informar esta información en cada línea de un archivo (todo lo que tiene que hacer es eliminar elEND
, que nunca fue realmente necesario, de la respuesta de JRFerguson, y Avinash Raj ya lo hace) ; mientras que para hacer eso con laexpr
solución, necesitaría agregar un ciclo explícito (y la respuesta de Gnouc no es fácilmente adaptable para hacer eso, eso puedo ver), y (2) lasawk
soluciones pueden adaptarse para informar todos los coincide en cada línea algo más fácilmente que laexpr
solución (de hecho, Avinash Raj's ya lo hace también).echo `...`
aquí?Otro comando awk ,
Al establecer el separador de campo como una cadena nula, awk convierte los caracteres individuales en el registro como campos separados.
fuente
Algunas alternativas incluyen:
similar a la respuesta de Gnouc, pero con el caparazón:
con
sed
ydc
posiblemente abarcando múltiples líneas:con
$IFS
...Eso también le dirá cómo muchos no son como ...
fuente