8
votes

Comment afficher des données depuis le début d'un fichier jusqu'à la première occurrence d'une expression régulière?

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


0 commentaires

11 Réponses :


2
votes

en Perl: xxx


3 commentaires

/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. :)



5
votes
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 ($).

0 commentaires

0
votes

Si Perl est une possibilité, vous pouvez faire quelque chose comme ceci:

% perl -0ne 'if (/B.*/) { print $`; last }' INPUT_FILE


1 commentaires

Semble excessive de lire un fichier entier en mémoire avant de faire quoi que ce soit.



7
votes

Si c'est à partir du début du fichier xxx

si vous souhaitez démarrer à partir d'un numéro de ligne spécifique xxx


0 commentaires

11
votes

Perl -pe 'Dernier if / ^ B /' Source.txt

Une explication: le commutateur -P ajoute une boucle autour du code, en la transformant en ceci: xxx

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.


0 commentaires

6
votes
sed -n '/^B/,$!p'  

4 commentaires

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. ! 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, ! é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



1
votes

Voici un Perl One-Liner:

perl -pe 'last if /B/' file


0 commentaires

2
votes

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'


1 commentaires

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. :)



3
votes

Certaines des commandes SED 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: xxx


0 commentaires

2
votes

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> xxx pré>

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 $.
}


0 commentaires

0
votes

Un doublure avec des commandes de coque de base: xxx


0 commentaires