![Nombre completo de grep incluyendo un punto en la palabra](https://rvso.com/image/154442/Nombre%20completo%20de%20grep%20incluyendo%20un%20punto%20en%20la%20palabra.png)
En un ksh
script de shell, estoy usando un grep
comando para obtener una palabra específica como se muestra a continuación.
$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst
$ grep -o "\wdef\w" file.txt
xyzdef
def
Quiero que la salida sea xyzdef.123
ydef.jkl
No se obtiene el valor después. .
¿Hay alguna otra forma de llegar a grep
esta palabra? Además, no sé la palabra exacta, grep
solo conozco un patrón. Estoy trabajando en ksh
shell.
Respuesta1
Parece que solo quieres la cadena def
y todos los caracteres que no sean espacios en blanco a su alrededor. Si es así, puedes utilizar:
$ grep -Eo '\S*def\S*' file.txt
xyzdef.123
def.jkl
Significa \S
que no hay espacios en blanco y GNU lo admite grep
con las banderas -E
o -P
.
Respuesta2
Uso grep -o
de clases de caracteres POSIX:
grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt
Esto es esencialmente lo queterdon sugiere, aunque usando una sintaxis ligeramente diferente (y no -E
). Esto coincidiría con la cadena def
y cualquier carácter que no esté en blanco a cada lado de esa cadena (un carácter que no esté en blanco es un carácter que no es un espacio ni una tabulación).
Alternativamente,
tr '[:blank:]' '\n' <file | grep -F 'def'
Esto simplemente divide la línea en varias líneas, una línea por palabra separada en espacios en blanco (donde un "espacio en blanco" es una tabulación o un carácter de espacio). Luego aplica una coincidencia de cadena simple en grep -F
las líneas generadas para encontrar las que le interesan.
Su patrón, \wdef\w
que con GNU grep
, si usa nombres de clases de caracteres POSIX, es el mismo que [[:alnum:]_]def[[:alnum:]_]
, requiere que la cadena def
esté flanqueada por un carácter alfanumérico o un guión bajo en cada lado. Un punto no es un carácter alfanumérico ni un guión bajo.
El patrón tampoco coincidirá def
si aparece al principio o al final de una línea.
Respuesta3
Con el intento que tienes, no logras coincidir con la palabra completa que se devolverá. La -o
bandera de grep
solo devuelve la parte de expresión regular coincidente definida. Tampoco \w
es una extensión definida por POSIX grep
y podría estar disponible solo en las versiones GNU que admiten la sintaxis PCRE. En lo que podrías hacer
grep -oP '(\w*)def[.](\w*)'
La -P
bandera activa el modo de expresión regular PCRE en GNU grep
y -o
devuelve la palabra completa que coincide con la expresión regular definida. La expresión regular se traduce como coincidencia con cero o más caracteres alfanuméricos seguidos de def
un literal .
(entre corchetes) y seguido de cero o más caracteres alfanuméricos.
El uso de clases de caracteres POSIX para caracteres alfanuméricos se haría a continuación. Pero recuerda que la bandera -o
sigue siendo una extensión de GNU.
grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)'