grep hasta 3 espacios con \ s
Según los siguientes tutoriales
- https://linuxize.com/post/regular-expressions-in-grep/
\ s Coincide con un espacio.
y
- https://www.guru99.com/linux-regular-expressions.html
Algunas expresiones regulares de intervalo son:
Descripción de expresión
{n} Coincide con el carácter anterior que aparece 'n' veces exactamente
{n, m} Coincide con el carácter anterior que aparece 'n' veces pero no más de m
{n,} Coincide con el carácter anterior solo cuando aparece 'n' veces o más
Archivo de muestra
wolf@linux:~$ cat space.txt 0space 1 spaces 2 spaces 3 spaces 4 spaces wolf@linux:~$
Solo quiero grep hasta 3 espacios solamente, mínimo 1 espacio, máximo 3 espacios Desafortunadamente, realmente no funciona como se esperaba.
wolf@linux:~$ cat space.txt | grep -P '\s{1,3}' 1 spaces 2 spaces 3 spaces 4 spaces wolf@linux:~$
wolf@linux:~$ cat space.txt | grep -P '\s{3}' 3 spaces 4 spaces wolf@linux:~$
wolf@linux:~$ cat space.txt | grep -P '\s{3,3}' 3 spaces 4 spaces wolf@linux:~$
wolf@linux:~$ cat space.txt | grep -P '\s{0,3}' 0space 1 spaces 2 spaces 3 spaces 4 spaces wolf@linux:~$
Salida deseada
wolf@linux:~$ cat space.txt | grep -P '\s{0,3}' <- need to fix it here 1 spaces 2 spaces 3 spaces wolf@linux:~$
Respuestas
necesitas:
grep -P '\S\s{1,3}\S' infile
\scoincide con un carácter de espacio en blanco, no solo con un espacio.
\Scoincide con un carácter que no es un espacio en blanco
en su intento, no está limitando que antes y después de sus partidos no deben ser espacios en blanco.
para filtrar solo en el espacio y evitar el uso de PCRE, puede hacer:
grep '[^ ] \{1,3\}[^ ]' infile
o para trabajar en líneas con espacios iniciales / finales de 1 ~ 3:
grep '\([^ ]\|^\) \{1,3\}\([^ ]\|$\)' infile
datos de entrada ( cat -e infile):
0space$
1 spaces$ 2 spaces$
3 spaces$ 4 spaces$
3spaces$ 4space$
3spaces $ 4spaces $
salida:
1 spaces$ 2 spaces$
3 spaces$ 3spaces$
3spaces $
Si desea hacer coincidir en una secuencia de 1 a 3 caracteres de espacio en blanco no rodeados por espacios en blanco, ahí es donde usaría los operadores de búsqueda de Perl:
grep -P '(?<!\s)\s{1,3}(?!\s)'
Coincide en:
1
1234567890123456789
a b c d e
^ ^^ ^^^
Con estándar grep, puede lograr el mismo efecto con:
grep -E '(^|[^[:space:]])[[:space:]]{1,3}([^[:space:]]|$)'
Esta vez hacemos coincidir en la secuencia de 1 a 3 caracteres de espacio en blanco y el espacio que no es en blanco a cada lado (o al inicio ( ^) o al final ( $) del sujeto).
1
1234567890123456789
a b c d e
^^^^ ^^^^
(con -o(una extensión GNU), encontrará que no informa a bcomo aya se coincidió anteriormente; cuando busca más coincidencias, comienza en el siguiente carácter después de la última coincidencia).
Sin -E, obtienes expresiones regulares básicas que no tienen operadores de alternancia (aunque algunas grepimplementaciones lo admiten \|como una extensión), pero de manera estándar, aún puedes hacer:
grep -x '\(.*[^[:space:]]\)\{0,1\}[[:space:]]\{1,3\}\([^[:space:]].*\)\{0,1\}'
Esta vez, la expresión regular coincide con la línea completa, incluidos los espacios de 1 a 3 y una parte inicial opcional ( \{0,1\}el equivalente de ERE ?) que termina en un espacio no en blanco y una parte opcional que la sigue que comienza con un espacio no en blanco.
1
1234567890123456789
a b c d e
^^^^^^^^^^^^^^^^^^
En cualquier caso, todavía devolverían líneas que contienen una secuencia de 4 o más espacios en blanco siempre que también contengan una secuencia de 1 a 3 espacios en blanco no rodeados de espacios en blanco.
Si el punto fuera excluir líneas que contienen secuencias de 4 o más espacios en blanco, entonces sería simplemente:
grep -vE '[[:space:]]{4}'
O si aún necesita al menos un espacio en blanco, o en otras palabras, que la línea contiene una o más secuencias de caracteres de espacios en blanco, todos los cuales tienen al menos un espacio en blanco pero no más de 3:
grep -vE -e '[[:space:]]{4}' -e '^[^[:space:]]*$'
Es decir, devolver todas las líneas excepto las que contienen una secuencia de 4 espacios en blanco y las que están hechas exclusivamente de espacios que no son en blanco.
O de nuevo con la mirada de Perl alrededor de los operadores:
grep -P '^(?=.*\s)(?!.*\s{4})'
Eso coincide con el comienzo de la línea, siempre que esté seguido por cualquier cantidad de caracteres y un espacio en blanco y que no esté seguido por ningún número de caracteres y una secuencia de 4 espacios en blanco.
Aunque sería más legible con sedo awkdonde puede hacer una coincidencia positiva y negativa en la misma invocación:
awk '/[[:space:]]/ && ! /[[:space:]]{4}/'
sed '/[[:space:]]/!d; /[[:space:]]\{4\}/d'
Puedes venir por el contrario. Excluir líneas con más de 3 espacios en la subcadena.
grep -Ev '\s{4,}'
-vInvierta el sentido de coincidencia para seleccionar líneas que no coincidan.
Puede insertar anclajes como caracteres que no sean espacios en blanco
grep -E '\S\s{1,3}\S'