Comment afficher les données du début d'un fichier jusqu'à la première occurrence d'une expression régulière?
Par exemple, si j'ai un fichier contenant: p>
One Two Three
11 Réponses :
en Perl:
/B.*/ correspondra à tout ce qui contient un B, pas en commençant par un B.
La question n'a pas indiqué que le 'B' devrait être au début d'une ligne.
Le -p au lieu de la -n vous donnera automatiquement cette impression à la fin. :)
sed '/^B/,$d' Read that as follows: Delete (d) all lines beginning with the first line that starts with a "B" (/^B/), up and until the last line ($).
Si Perl est une possibilité, vous pouvez faire quelque chose comme ceci:
% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE
Semble excessive de lire un fichier entier en mémoire avant de faire quoi que ce soit.
Si c'est à partir du début du fichier si vous souhaitez démarrer à partir d'un numéro de ligne spécifique p>
Une explication: le commutateur -P ajoute une boucle autour du code, en la transformant en ceci: p> Le dernier mot clé sort immédiatement de la boucle environnante si La condition tient - dans ce cas, / ^ b /, qui indique que la ligne commence par un b. p> p>
Perl -pe 'Dernier if / ^ B /' Source.txt
code>
sed -n '/^B/,$!p'
Malheureusement, ces impressions, y compris la ligne "Bravo", tandis que la question veut exclure la ligne "Bravo".
Arghh! ... n'a pas lu la question correctement. Mis à jour avec action inverse «! P» (c.-à-d. Imprimer!) Pour tout ce qui n'est pas compris entre / ^ b / et la fin du fichier. Merci beaucoup d'avoir repéré ce NDIM.
Ah. ! code> modifie une plage d'adresses telle qu'elle ne correspond que lorsque cela ne correspondrait pas, et inversement. Cela fait toujours partie de la gamme d'adresses. Eh bien,
! Code> était nouveau pour moi ... merci de m'avoir dirigé.
Ne cesserait-il pas d'être mieux pour ne pas lire plus loin que nécessaire? Stackoverflow.com/a/1947950/895245
Voici un Perl One-Liner:
perl -pe 'last if /B/' file
Il suffit de partager des réponses que j'ai reçues:
Imprimez les données à partir de la première ligne et continuez jusqu'à ce que nous trouvions une correspondance à la regex, puis arrêtez: P>
<command> | sed -n '1,/<regex>/p'
L'opérateur Flip Flop est l'un de mes favoris, et cette situation est l'une des rares fois que je dois l'utiliser. :)
Certaines des commandes code> SED CODE> données par d'autres personnes continueront à traiter inutilement l'entrée après la découverte de la regex qui pourrait être assez lente pour une grande entrée. Ceci arrête lorsque la regex est trouvée:
Votre problème est une variation d'une réponse dans PERLFAQ6 : Comment puis-je extraire des lignes entre deux modèles qui sont eux-mêmes sur différentes lignes? .
vous Peut utiliser l'opérateur quelque peu exotique de Perl (documenté dans Perlop): p> Si vous vouliez du texte et non des lignes, vous utiliseriez P> while (<>) {
$in_header = 1 .. /^$/;
$in_body = /^$/ .. eof;
# now choose between them
} continue {
$. = 0 if eof; # fix $.
}
Un doublure avec des commandes de coque de base: