Nome completo do Grep incluindo ponto na palavra

Nome completo do Grep incluindo ponto na palavra

Em um kshscript de shell, estou usando um grepcomando para obter uma palavra específica, conforme mostrado abaixo.

$ cat file.txt
abc xyzdef.123 def.jkl mnopqrst

$ grep -o "\wdef\w" file.txt
xyzdef
def

Eu quero que a saída seja xyzdef.123edef.jkl

Não está buscando o valor depois. .Existe alguma outra maneira para grepessa palavra também não sei a palavra exata grepapenas conheço um padrão. Estou trabalhando no kshshell.

Responder1

Parece que você quer apenas a string defe todos os caracteres que não sejam espaços em branco ao seu redor. Se sim, você pode usar:

$ grep -Eo '\S*def\S*' file.txt 
xyzdef.123
def.jkl

O \Ssignifica não espaço em branco e é suportado pelo GNU grepcom os sinalizadores -Eou -P.

Responder2

Usando grep -oclasses de caracteres POSIX:

grep -o '[^[:blank:]]*def[^[:blank:]]*' file.txt

Isto é essencialmente o queTerdon sugere, embora usando uma sintaxe ligeiramente diferente (e não -E). Isso corresponderia à string defe a qualquer caractere que não esteja em branco em ambos os lados dessa string (um caractere que não esteja em branco é um caractere que não é um espaço ou uma tabulação).

Alternativamente,

tr '[:blank:]' '\n' <file | grep -F 'def'

Isso apenas divide a linha em várias linhas, uma linha por palavra separada em branco (onde um "espaço" é uma tabulação ou um caractere de espaço). Em seguida, ele aplica uma correspondência de string simples grep -Fnas linhas geradas para encontrar aquelas nas quais você está interessado.


Seu padrão, \wdef\w, que com GNU grep, se estiver usando nomes de classes de caracteres POSIX, é o mesmo que [[:alnum:]_]def[[:alnum:]_], requer que a string defseja flanqueada por um caractere alfanumérico ou sublinhado em ambos os lados. Um ponto não é um caractere alfanumérico nem um sublinhado.

O padrão também não corresponderia defse ocorresse no início ou no final de uma linha.

Responder3

Com a tentativa que você fez, você não consegue corresponder a palavra inteira a ser retornada. O -osinalizador grepretorna apenas a parte regex correspondente definida. Também \wnão é uma extensão definida pelo POSIX grepe pode estar disponível apenas nas versões GNU que suportam a sintaxe PCRE. Em que você poderia fazer

grep -oP '(\w*)def[.](\w*)'

O -Psinalizador ativa o modo regex PCRE no GNU grepe o -osinalizador retorna a palavra inteira que corresponde ao regex definido. O regex é traduzido como correspondência de zero ou mais caracteres alfanuméricos seguido por defum literal .(entre colchetes) e seguido por zero ou mais caracteres alfanuméricos.

Usar classes de caracteres POSIX para caracteres alfanuméricos seria o seguinte. Mas lembre-se que a bandeira -oainda é uma extensão GNU

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

informação relacionada