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 pcregrep
au lieu de régulier grep
:
pcregrep -M "pattern1.*\n.*pattern2" filename
L' -M
option 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
-P
est utilisé pour les expressions régulières Perl (une extension de POSIX grep
).\s
correspond 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. -P
est 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 grep
obtenir 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 \n
est 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 beginning
est une ligne vide etnew line at end
s'applique à chaque ligne du fichier. Pouvez-vous poster un exemple?