11
votes

bash grep nouvelle ligne

[ Insertion éditoriale : duplicaté possible de la même affiche question antérieure ?]

hi, j'ai besoin d'extraire du fichier: xxx

en utilisant le Commande Grep, la ligne suivante: xxx

Comment la commande Grep devrait-elle ressembler?


6 commentaires

Voulez-vous dire cela littéralement ou voulez-vous dire que vous voulez la deuxième et la troisième ligne, peu importe le contenu qu'ils ont? En outre, est-ce votre devoir?


Pas mes devoirs, juste une tâche. Je ne sais pas exactement comment construire une expression régulière ici.


Ce que je veux, c'est construire une expression régulière qui contiendra un caractère nouveau.


Grep est intrinsèquement axé sur la ligne. Vous n'avez pas besoin d'une expression régulière pour correspondre à la chaîne littérale 'd'abord »ou« deuxième ». Permettez-moi de demander à nouveau: voulez-vous correspondre à ces mots exacts ou voulez-vous correspondre à ceci: la deuxième ligne + la troisième ligne (sans égard au contenu)? Si vous souhaitez faire correspondre deux lignes spécifiques, l'une des solutions de Liori serait meilleure que grep . S'il vous plaît essayez d'expliquer ce que vous voulez plus clairement.


Je souhaite rechercher dans le fichier d'une séquence de lignes pour ex "Line1 \ nLine2".


Si vous souhaitez rechercher une séquence de lignes et que vous souhaitez ajouter des mots au fichier, alors grep n'est pas le bon outil. Cela ressemble plus à un travail pour moi, mais à nouveau sans une meilleure description du vrai problème, il est impossible de vous aider. Veuillez éditer votre question et montrer (1) données raisonnablement réalistes et (2) une explication plus complète de ce que vous voulez faire avec le fichier.


11 Réponses :


1
votes

ligne? Ou des lignes?

Essayez xxx

EDIT: grep est orienté ligne. Vous allez devoir utiliser Perl, SED ou Awk pour effectuer la correspondance des motifs entre les lignes.

BTW -E Dites à Grep que le REGEXP est prolongé RE.


2 commentaires

Lignes. Mais qu'en est-il de construire une expression régulière qui sera utilisée par Egrep? Comment le nouveau caractère de ligne est représenté?


Nom de fichier 'deuxième \\ Nthird' 'secondaire



0
votes
grep -E '(second|third)' /path/to/file
egrep -w 'second|third' /path/to/file

0 commentaires

2
votes

Je ne comprends pas vraiment ce que vous voulez faire correspondre. Je n'utiliserais pas Grep, mais l'une des opérations suivantes:

tail -2 file         # to get last two lines
head -n +2 file      # to get all but first line
sed -e '2,3p;d' file # to get lines from second to third


0 commentaires

8
votes

Votre question Résumé «Bash Grep Newline», implique que vous voudriez correspondre à la séquence secondaire \ Nthrird de caractères - c'est-à-dire. Quelque chose contenant nouvelle en informatique.

Étant donné que le Grep fonctionne sur "lignes" et ces deux lignes sont différentes, vous ne serez pas en mesure de le faire correspondre de cette façon.

Donc, je l'ai divisé en plusieurs tâches:

  1. Vous faites correspondre la ligne contenant "seconde" et sortie la ligne qui a assorti et la ligne suivante: XXX

  2. Vous traduisez toutes les autres nouvelles dans la séquence qui est garantie pour ne pas se produire dans l'entrée. Je pense que le moyen le plus simple de le faire serait d'utiliser Perl: XXX

  3. Vous faites un grep sur ces lignes, cette fois recherchant une chaîne ## inutilisée ## troisième : XXX

  4. Vous repliez les séquences inutilisées dans les nouvelles lignes, SED pourrait être la plus simple: XXX

    donc la commande de tuyau résultante pour faire ce que vous voulez ressembler à ce que vous voulez ressembler à: xxx

    pas le plus élégant de loin, mais devrait fonctionner. Je suis curieux de connaître de meilleures approches, cependant - il devrait y en avoir.


0 commentaires

1
votes

Vous ne voulez tout simplement pas la ligne contenant "d'abord"? -v code> invertit les résultats du GREP.

$ echo -e "first\nsecond\nthird\n" | grep -v first
second
third


0 commentaires

3
votes

Je ne pense pas grep est la voie à suivre.

Si vous voulez simplement dépouiller la première ligne de n'importe quel fichier (pour généraliser votre question), j'utiliserais < fort> sed à la place. xxx

Ceci enverra le contenu du fichier à la sortie standard avec la première ligne supprimée.

alors que vous peut rediriger la sortie standard dans un autre fichier pour capturer les résultats. xxx

qui devrait le faire.

Si vous devez utiliser grep < / forte> et ne veulent tout simplement pas afficher la ligne avec premier dessus, puis essayez ceci: xxx

en passant le -V Switch, vous racontez grep de vous montrer tout mais l'expression que vous passez. En effet, montre-moi tout sauf la ligne (s) avec premier en eux.

Cependant, l'inconvénient est qu'un fichier avec plusieurs premier est de ne pas montrer ces autres lignes non plus et peut ne pas être le comportement que vous attendez.

Pour déranger les résultats dans un nouveau fichier, essayez ceci: xxx

espère que cela aide.


1 commentaires

Je pense que vous pouvez avoir vos deux derniers exemples à l'envers.



20
votes

au lieu de grep , vous pouvez utiliser pcregrep qui prend en charge les motifs multilignes xxx

-m permet le motif pour correspondre à plus d'une ligne.


1 commentaires

Vous voudrez peut-être utiliser \ s + à la place de \ n en fonction des terminaisons dans le fichier (certains pourraient être \ r \ n )



0
votes

Vous pouvez utiliser

$ grep -1 third filename


0 commentaires

0
votes

J'aime Notnoop's Réponse , mais construire sur La réponse d'Andrewy (qui est meilleure pour ceux sans PCREGREP, mais trop compliqué), vous pouvez simplement faire:

RESULT=`grep -A1 -s -m1 '^\s*second\s*$' file | grep -s -B1 -m1 '^\s*third\s*$'`


0 commentaires

0
votes
grep -v '^first' filename
Where the -v flag inverts the match.

0 commentaires

1
votes

grep -a1 "Deuxième" | grep -b1 "troisième" fonctionne bien et si vous avez plusieurs matchs, il se débarrassera même du délimiteur d'origine - correspondant


0 commentaires