Quero encontrar uma string em uma linha de texto e imprimir a string (entre espaços) e a primeira palavra da frase.
Por exemplo:
"Esta é uma única linha de texto" "Outra coisa" "É melhor você tentar de novo" "Melhor"
A lista de strings é:
texto coisa experimentar Melhor
O que estou tentando é obter uma tabela como esta:
Este texto [guia] Outra coisa [tab] Ele tenta Melhor
Eu tentei com grep, mas nada ocorreu. Alguma sugestão?
command-line
text-processing
regex
Felipe Lira
fonte
fonte
Respostas:
Versão Bash / grep:
Chame assim:
Resultado:
fonte
Perl para o resgate!
Salvar como
first-plus-word
, execute comoEle cria uma regex a partir das palavras de entrada. Cada linha é comparada com a regex e, se houver uma correspondência, a primeira palavra será impressa e, se for diferente da palavra, a palavra também será impressa.
fonte
Aqui está uma versão awk:
Onde
file2
está a lista de palavras efile1
contém as frases.fonte
Aqui está a versão python:
Demo:
Nota lateral : o script é
python3
compatível, portanto, você pode executá-lo compython2
oupython3
.fonte
Tente o seguinte:
Se a guia anterior a
Better
for um problema, tente o seguinte:O acima foi testado no GNU sed (chamado
gsed
no OSX). Para o BSD sed, algumas pequenas alterações podem ser necessárias.Como funciona
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
Isso procura por uma palavra,
[[:alnum:]]+
seguida por um espaço,[[:space:]]
seguida por qualquer coisa.*
, seguida por uma de suas palavrastext|thing|try|Better
, seguida por qualquer coisa. Se isso for encontrado, ele será substituído pela primeira palavra na linha (se houver), uma guia e a palavra correspondente.ta; b; :a; s/^\t//; p
Se o comando de substituição resultou em uma substituição, significando que uma das suas palavras foi encontrada na linha, o
ta
comando diz ao sed para pular para o rótuloa
. Caso contrário, ramificamos (b
) para a próxima linha.:a
define o rótulo a. Portanto, se uma das suas palavras foi encontrada, (a) fazemos a substituiçãos/^\t//
que remove uma guia à esquerda, se houver uma, e (b) imprimimos (p
) a linha.fonte
Uma abordagem simples bash / sed:
O
while read w; do ...; done < words
iterará sobre cada linha do arquivowords
e o salvará como$w
. O-n
fazsed
não imprime nada por padrão. Osed
comando, então, substituirá aspas duplas seguidas por espaços em branco (\"(\S*)
, os parênteses servem para "capturar" o que corresponde\S*
à primeira palavra, e depois podemos nos referir a ela como\1
), 0 ou mais caracteres (.*
) e, em seguida, o palavra que estamos procurando ($w
) e 0 ou mais caracteres novamente (.*
). Se este partidas, nós substitui-lo com apenas o 1º palavra, um guia e$w
(\1\t$w
), e imprimir a linha (que é o que op
nos///p
faz).fonte
Esta é a versão Ruby
O arquivo de texto de amostra
hello.txt
contémExecutando com
ruby source.rb hello.txt
resultados emfonte