![Nome completo do Grep incluindo ponto na palavra](https://rvso.com/image/154442/Nome%20completo%20do%20Grep%20incluindo%20ponto%20na%20palavra.png)
Em um ksh
script de shell, estou usando um grep
comando 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.123
edef.jkl
Não está buscando o valor depois. .
Existe alguma outra maneira para grep
essa palavra também não sei a palavra exata grep
apenas conheço um padrão. Estou trabalhando no ksh
shell.
Responder1
Parece que você quer apenas a string def
e 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 \S
significa não espaço em branco e é suportado pelo GNU grep
com os sinalizadores -E
ou -P
.
Responder2
Usando grep -o
classes 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 def
e 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 -F
nas 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 def
seja 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 def
se 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 -o
sinalizador grep
retorna apenas a parte regex correspondente definida. Também \w
não é uma extensão definida pelo POSIX grep
e 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 -P
sinalizador ativa o modo regex PCRE no GNU grep
e o -o
sinalizador retorna a palavra inteira que corresponde ao regex definido. O regex é traduzido como correspondência de zero ou mais caracteres alfanuméricos seguido por def
um 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 -o
ainda é uma extensão GNU
grep -o '\([[:alnum:]]*\)def[.]\([[:alnum:]]*\)'