Comment donner un motif pour une nouvelle ligne dans grep? Nouvelle ligne au début, nouvelle ligne à la fin. Pas la manière d'expression régulière. Quelque chose comme \ n.
$. C'est un peu limité, mais utilisable dans des cas simples.
Comment donner un motif pour une nouvelle ligne dans grep? Nouvelle ligne au début, nouvelle ligne à la fin. Pas la manière d'expression régulière. Quelque chose comme \ n.
$. C'est un peu limité, mais utilisable dans des cas simples.
Réponses:
grep les motifs sont comparés à des lignes individuelles, il n'y a donc aucun moyen pour un motif de correspondre à une nouvelle ligne trouvée dans l'entrée.
Cependant, vous pouvez trouver des lignes vides comme ceci:
grep '^$' file
grep '^[[:space:]]*$' file # include white spaces
essayez pcregrepau lieu de régulier grep:
pcregrep -M "pattern1.*\n.*pattern2" filename
L' -Moption lui permet de correspondre sur plusieurs lignes, vous pouvez donc rechercher des nouvelles lignes en tant que \n.
Vous pouvez utiliser cette façon ...
grep -P '^\s$' file
-Pest utilisé pour les expressions régulières Perl (une extension de POSIX grep).\scorrespond aux caractères d'espacement; s'il est suivi de *, il correspond également à une ligne vide.^correspond au début de la ligne. $correspond à la fin de la ligne. -Pest une extension GNU. Je suis très bien pour l'utiliser lorsque la situation l'exige (généralement lookahead / lookbehind), mais POSIX grep peut le faire simplement avec [[:space:]].
-P. GNU est de toute façon assez standard. :)
brew install grepobtenir GNU grep, qui est supérieur à plusieurs égards. apple.stackexchange.com/questions/193288/…
Grâce à @jarno, je connais l'option -z et j'ai découvert que lors de l'utilisation de GNU grep avec l'option -P, la correspondance avec \nest possible . :)
Exemple:
grep -zoP 'foo\n\K.*'<<<$'foo\nbar'
Tirages bar
En ce qui concerne la solution de contournement (sans utiliser de non portable -P), vous pouvez remplacer temporairement un caractère de nouvelle ligne par le différent et le modifier, par exemple:
grep -o "_foo_" <(paste -sd_ file) | tr -d '_'
Fondamentalement, il recherche une correspondance exacte _foo_où _signifie \n(so __= \n\n). Vous n'avez pas besoin de le traduire en arrière tr '_' '\n', car chaque motif serait imprimé dans la nouvelle ligne de toute façon, il _suffit donc de le supprimer .
<(p paste -sd_ file )?
Viens juste de trouver
grep $'\r'
Il est utilisé $'\r'pour l'évasion de style C dans Bash.
dans cet article
new line at the beginningest une ligne vide etnew line at ends'applique à chaque ligne du fichier. Pouvez-vous poster un exemple?