Je veux trouver une chaîne dans une ligne de texte et imprimer la chaîne (entre les espaces) et le premier mot de la phrase.
Par exemple:
"Ceci est une seule ligne de texte" "Autre chose" "Il vaut mieux réessayer" "Mieux"
La liste des chaînes est:
texte chose essayer Mieux
Ce que j'essaie, c'est d'obtenir une table comme celle-ci:
Ce texte [tab] Une autre chose [tab] Il [tab] essaie Mieux
J'ai essayé avec grep mais rien ne s'est produit. Toute suggestion?
command-line
text-processing
regex
Felipe Lira
la source
la source
Réponses:
Version Bash / grep:
Appelez-le ainsi:
Production:
la source
Perl à la rescousse!
Enregistrer sous
first-plus-word
, exécuter sousIl crée une expression régulière à partir des mots d'entrée. Chaque ligne est ensuite comparée à l'expression rationnelle, et s'il y a correspondance, le premier mot est imprimé et s'il est différent du mot, le mot est également imprimé.
la source
Voici une version awk:
où
file2
est la liste de mots etfile1
contient les phrases.la source
Voici la version python:
Démo:
Note latérale : le script est
python3
compatible, vous pouvez donc l'exécuter avecpython2
oupython3
.la source
Essaye ça:
Si l'onglet avant le
Better
est un problème, essayez ceci:Ce qui précède a été testé sur GNU sed (appelé
gsed
sur OSX). Pour BSD sed, quelques modifications mineures peuvent être nécessaires.Comment ça fonctionne
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
Cela recherche un mot,
[[:alnum:]]+
suivi d'un espace,[[:space:]]
suivi de n'importe quoi.*
, suivi d'un de vos motstext|thing|try|Better
, suivi de n'importe quoi. S'il est trouvé, il est remplacé par le premier mot de la ligne (le cas échéant), un onglet et le mot correspondant.ta; b; :a; s/^\t//; p
Si la commande de substitution a entraîné une substitution, ce qui signifie qu'un de vos mots a été trouvé sur la ligne, la
ta
commande indique à sed de passer à l'étiquettea
. Sinon, nous branchons (b
) à la ligne suivante.:a
définit l'étiquette a. Donc, si l'un de vos mots a été trouvé, nous (a) faisons la substitutions/^\t//
qui supprime un onglet de tête s'il y en a un, et (b) imprimons (p
) la ligne.la source
Une approche bash / sed simple:
Le
while read w; do ...; done < words
va parcourir chaque ligne du fichierwords
et l'enregistrer sous$w
. La-n
marquesed
n'imprime rien par défaut. Lased
commande remplacera ensuite les guillemets doubles suivis par des espaces non blancs (\"(\S*)
, les parenthèses servent à "capturer" ce qui correspond\S*
, le premier mot, et nous pourrons plus tard l'appeler\1
), 0 ou plusieurs caractères (.*
), puis le mot que nous recherchons ($w
) et 0 ou plusieurs caractères à nouveau (.*
). Si cela correspond, nous le remplaçons par seulement le 1er mot, un onglet et$w
(\1\t$w
), et imprimons la ligne (c'est ce que fait lep
ins///p
).la source
Ceci est la version Ruby
L'exemple de fichier texte
hello.txt
contientExécution avec des
ruby source.rb hello.txt
résultats dansla source