web-dev-qa-db-fra.com

Comment supprimer le reste de chaque ligne après un certain modèle ou une chaîne dans un fichier?

Supposons que j'ai une liste d'URL dans un fichier texte:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

Je veux supprimer tout ce qui vient après ".com".

Résultats attendus:

google.com
unix.stackexchange.com
isuckatunix.com

J'ai essayé

sed 's/.com*//' file.txt 

mais il a supprimé .com ainsi que.

22
Koshur

Pour supprimer explicitement tout ce qui vient après ".com", il suffit de modifier votre solution sed existante pour remplacer ".com (n'importe quoi)" par ".com":

sed 's/\.com.*/.com/' file.txt

J'ai modifié votre regex pour échapper à la première période; sinon, cela aurait correspondu à quelque chose comme "thisiscommon.com/something".

Notez que vous souhaiterez peut-être ancrer davantage le modèle ".com" avec une barre oblique finale afin de ne pas supprimer accidentellement quelque chose comme "sub.com.domain.com/foo":

sed 's/\.com\/.*/.com/' file.txt
20
Jeff Schaller

Vous pouvez utiliser le séparateur de champ de awk (-F) manière suivante:

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

Explication:

NAME
       awk - pattern scanning and processing language
-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

Comme vous voulez supprimer toutes les choses après .com, -F '.com' sépare la ligne avec .com et print $1 ne donne en sortie que la partie avant .com. Donc, $1".com" ajoute .com et vous donne la sortie attendue.

9
Pandya

Le meilleur outil pour l'édition de fichiers sur place non interactive est ex.

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

Si vous avez utilisé vi et si vous avez déjà tapé une commande commençant par deux points : vous avez utilisé une commande ex. Bien sûr, bon nombre des commandes les plus avancées ou les plus "fantaisistes" que vous pouvez exécuter de cette façon sont des extensions Vim (par exemple :bufdo) et ne sont pas définis dans les spécifications POSIX pour ex , mais ces spécifications permettent un degré de puissance et de flexibilité vraiment étonnant dans l'édition de texte non visuel (interactif ou automatisé) ).

La commande ci-dessus comporte plusieurs parties.

-s active le mode silencieux pour préparer ex à une utilisation par lots. (Supprimer les messages de sortie et. Al.)

-c spécifie la commande à exécuter une fois le fichier (file.txt, dans ce cas) est ouvert dans un tampon.

% est un spécificateur d'adresse équivalent à 1,$— cela signifie que la commande suivante est appliquée à toutes les lignes du tampon.

s est la commande de substitution que vous connaissez probablement déjà. Il est couramment utilisé dans vi et possède des fonctionnalités essentiellement identiques à la commande s de sed , bien que certaines des fonctionnalités avancées d'expression régulière puissent varier selon la mise en oeuvre. Dans ce cas, de ".com" à la fin de la ligne est remplacé par ".com".

La barre verticale sépare les commandes séquentielles à exécuter. Dans de nombreuses (la plupart) ex implémentations, vous pouvez également utiliser un -c option, comme ceci:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

Cependant, cela n'est pas requis par POSIX.

La commande x se ferme, après avoir écrit toutes les modifications apportées au fichier. Contrairement à wq qui signifie "écrire et quitter", x n'écrit dans le fichier que si le tampon a été modifié. Ainsi, si votre fichier n'est pas modifié, l'horodatage sera conservé.

4
Wildcard

Très rapide, simple et sale python façon:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

Exemple d'exécution

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo
2
Sergiy Kolodyazhnyy