-2
votes

Bash: Texte de grep dans une longue chaîne

Quelqu'un peut-il expliquer comment écrire une regex pour obtenir une valeur dans un très long fichier txt rempli de méta. Le fichier entier est sans aucun séparateur de nouveau-ligne, juste une très longue chaîne, qui est difficile à lire ou à analyser

J'ai besoin de valeurs de Grep après le nom d'utilisateur clé. Quelqu'un peut-il aider? Semble être bloqué écrire une extermination de regex appropriée pour cette affaire xxx

dans l'exemple ci-dessus, j'ai besoin de la sortie suivante xxx / p>


5 commentaires

Si perl est une solution acceptable, utilisez perl -wn -le 'imprimer pour /\"username\\\";.*?\\\\"([^\\\"]+) / g '


Spécifiez le format du fichier. Qu'est-ce qui est derrière le ... ? Toutes les pièces comprennent-elles en S: : \ " \"; ? alors tr substitut ; pour newline, grep pour la sortie et extraire les pièces de l'intérieur du " à l'aide de sed ou` couper`


Corion Merci, mais le code suggéré donnerait à S: 12: en sortie pour chaque valeur au lieu des noms d'utilisateurs Valeurs @Kamilcuk, il s'agit essentiellement d'un fichier .txt sans aucun nouveau nouveau caractères. Derrière ... Je veux dire qu'il existe d'autres clés différentes + des valeurs dans Meta, mais il suffit de sauvegarder toutes les valeurs des noms d'utilisateur et non rien d'autre. La scission serait probablement une solution probablement mais la tâche est de ne pas utiliser de fractionnement, ce qui m'a rendu coincé merci encore de l'aide.


J'ai mis à jour mon code dans l'intervalle. Si Perl est acceptable, je le posterai comme une réponse.


Cela ressemble au format Serialize (CODE> SERIALIZEZ () PHP. Pourquoi ne pas utiliser php pour l'analyser au lieu de grep ?


3 Réponses :


0
votes

avec GNU AWK (j'ai ajouté l'impression du numéro de champ pour clarté ici avec l'impression i devant $ i ): xxx

Si vous voulez que le champ suivant ces champs: xxx

Vous pouvez utiliser gnu grep: xxx

ou perl Si vous voulez juste que le groupe de match: xxx


2 commentaires

Merci mais peut-être que je n'ai pas précisé correctement dans ma question initiale dont j'ai besoin pour les valeurs de Grep après le nom d'utilisateur et avant la compagnie. Alors ne peut être pas utilisateur mais quoi que ce soit. Fondamentalement, toute chaîne peut être présente


Veuillez mettre à jour votre question avec la sortie souhaitée.



0
votes

Pour l'entrée LOKKING comme ceci:

< file \
tr ';' '\n' |
sed 's/^.*:\\"\(.*\)\\"$/\1/' |
grep -x "USER1\|USER2\|USER3_HERE"
  • substituer le ; code> pour la nouvelle ligne li>
  • filtre le texte entre le : \ "... \" code> li>
  • Grep uniquement pour User1 User2 ou User3_Here Strings Li> ul> p>


0 commentaires

1
votes

avec perl, il est xxx pré>

-n code> - ligne de fichier de processus par ligne, mais n'imprimez rien p>

-l code> - Coin de la ligne de poignée p>

-E code> - exécutez le code suivant p> xxx pré>

Imprimer la sortie capturée Chaque fois que vous voyez \ "nom d'utilisateur \"; code> suivi de quelque chose suivi de \ " code>. p>

SORTIE H3>
$ perl -wn -le 'print for /\\"username\\";.*?\\"([^\\"]+)/g'
    .."somevalue\";s:7:\"text1\";s:8:\"username\";s:9:\"USER1\";s:7:\"company\";s:3:\"text2\";s:5:\  "somevalue\";s:11:\"text11\";s:8:\"username\";s:15:\"USER2\";s:7:\"company\";s:17:\"XXXX\";s:5:\...   "somevalue\";s:15:\"text110000\";s:8:\"username\";s:12:\"USER3_HERE\";s:7:\"company\";s:18:\"yyyyy\";s:

USER1
USER2
USER3_HERE


1 commentaires

parfait! exactement ce que je cherche, et merci pour une explication très détaillée