Nombre completo de grep incluyendo un punto en la palabra

Nombre completo de grep incluyendo un punto en la palabra

En un kshscript de shell, estoy usando un grepcomando 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.123ydef.jkl

No se obtiene el valor después. .¿Hay alguna otra forma de llegar a grepesta palabra? Además, no sé la palabra exacta, grepsolo conozco un patrón. Estoy trabajando en kshshell.

Respuesta1

Parece que solo quieres la cadena defy 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 \Sque no hay espacios en blanco y GNU lo admite grepcon las banderas -Eo -P.

Respuesta2

Uso grep -ode 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 defy 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 -Flas líneas generadas para encontrar las que le interesan.


Su patrón, \wdef\wque con GNU grep, si usa nombres de clases de caracteres POSIX, es el mismo que [[:alnum:]_]def[[:alnum:]_], requiere que la cadena defesté 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á defsi 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 -obandera de grepsolo devuelve la parte de expresión regular coincidente definida. Tampoco \wes una extensión definida por POSIX grepy 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 -Pbandera activa el modo de expresión regular PCRE en GNU grepy -odevuelve 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 defun 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 -osigue siendo una extensión de GNU.

grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)' 

información relacionada