grep --before-context 5
montre 5 lignes avant le match.
Je veux tout montrer avant le match.
Cela grep --before-context 99999999
fonctionnerait, mais ce n'est pas très ... professionnel.
Comment afficher tout le fichier jusqu'au match?
text-processing
awk
sed
grep
Nicolas Raoul
la source
la source
sed '/PATTERN/Q' FILE
ignorera la ligne correspondante.Q
est une extension GNU, donc cela ne fonctionnera pas avec sed.sed
peut remplacer la plupart des fonctionnalités de grep.Cela signifie que l’impression commence à la première ligne jusqu’à ce que le motif corresponde.
Quelques exemples de gamme
la source
imprimer jusqu'au match inclus:
imprimer jusqu'à MAIS sans inclure le match:
la source
Q
est cool mais spécifique au gnou,sed -n '/pattern/!p;//q'
serait plus portable.!
celap
s'applique aux lignes ne correspondant paspattern
, mais//q
cela//
signifie "expression régulière précédente" (je pensais que cela signifiait "faire correspondre la chaîne vide"). Je pense qu'une version plus courte de la même solution estsed -n '/pattern/q;p
:?Les
grep
méthodes GNU pures suivantes ne sont pas efficaces.Recherchez tout jusqu'à la première instance de la chaîne " foo " dans la barre de fichiers , en utilisant trois
grep
mots:Correspondant à la dernière instance de " foo ":
Remarque: les détails sur le dernier
grep
peuvent être trouvés dans: Regex (grep) pour la recherche multiligne nécessaire .la source
grep
s (+ pcre) quand il s’agit simplement de lancer une seulesed
invocation:sed 'x;/./G;//!x;/foo/p;//s/.*//;x;d'
??sed
code semble avoir sa propre réponse, ou pourrait être ajouté à l'un des autres. Re 7grep
s: Parce qu'il n'y avait pas degrep
réponse ... (plus, la réponse aide montre pourquoi pas.)Ajoutant à la réponse de Mikel ci-dessus ...
Pour imprimer toutes les lignes jusqu'à, mais sans inclure , la première ligne
FILE
contenantPATTERN
, essayez:sed '/.*PATTERN.*/{s///;q;}' FILE
Cela correspond à la ligne entière contenant le motif, le remplace par une ligne vierge, puis se ferme sans traiter le reste du fichier.
Post-script:
Le moyen le plus simple et le plus clair que je pouvais imaginer pour empêcher l’impression d’une nouvelle ligne supplémentaire à la fin (sans faire appel à un autre outil) était de lancer à nouveau sed et de supprimer la nouvelle ligne finale:
... et puisque nous supprimons cette ligne de toute façon, nos travaux précédents sont redondants et nous pouvons simplifier pour:
la source
sed
invocation.tcsh
et enbash
alias, je devais m'assurer que je avait une solution monoligne relativement concise qui fonctionnait à la fois en version standard et GNUsed
(pour la portabilité); toutes les exigences que votre contribution peut très bien avoir satisfait. En tant que personne qui utilisesed
très rarement, mon exigence la plus importante concernait quelque chose que je pouvais comprendre rapidement lorsque je souhaitais la modifier ou la réutiliser facilement dans des années.Pour les personnes qui choisissent de ne retenir que les outils de base du travail quotidien et qui souhaitent accepter des solutions moins élégantes et moins efficaces:
Si cette commande concerne un script, je rechercherai des solutions plus élégantes (et éventuellement plus efficaces). S'il s'agit d'une commande unique ou d'un script à jeter, je m'en fiche.
la source
Vous pouvez également utiliser l'un des éléments suivants
ou
ou
La première option est très similaire à celle suggérée par le PO, elle s'assure seulement de montrer suffisamment de lignes avant le contexte en comptant les lignes du fichier.
La deuxième option recherche le numéro de ligne de la première correspondance (vous pouvez également changer cela en modifiant la "tête" intérieure) et utilise ensuite tête sur ce numéro.
La dernière option remplace toutes les nouvelles lignes par la correspondance et que remplace deux correspondances adjacentes par une nouvelle ligne. La sortie de ceci est une ligne pour chaque bloc de texte entre deux correspondances. Après cela, il utilise 'head' pour choisir la première ligne (lier le bloc de texte jusqu'à la première correspondance) et reconvertit chaque correspondance en une nouvelle ligne. cette option ne fonctionne que si le fichier est au format suivant
et ainsi de suite
la source
sed
commande au bas de la page est un peu maladroite.