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


21

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 également supprimé .com.


Y a-t-il une raison spécifique pour laquelle vous souhaitez rechercher .comuniquement au lieu de tout supprimer après et en incluant le premier /caractère? Et si vous aviez une URL comme en.wikipedia.org/wiki/Ubuntudans votre liste?
Byte Commander

Réponses:


17

Pour supprimer explicitement tout ce qui vient après ".com", ajustez simplement 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

9

Vous pouvez utiliser awkle séparateur de champs de ( -F) de la 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 .comet ne print $1donne la sortie que la partie précédente .com. Donc, $1".com"ajoute .comet vous donne la sortie attendue.


Pourquoi pas tout /comme FS et prendre le premier champ?
heemayl


1
@Pandya: Cet échec avec une chaîne commeacomercial.com/asdsad
cuonglm

@cuonglm Merci de l'avoir signalé. Réponse améliorée
Pandya

4

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é viet 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éfinies dans les spécifications POSIX pourex , mais ces spécifications permettent un degré vraiment incroyable de puissance et de flexibilité dans le domaine non visuel. édition de texte (interactive ou automatisée).

La commande ci-dessus comporte plusieurs parties.

-s active le mode silencieux pour préparer ex 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,$ —il signifie que la commande suivante est appliquée à toutes les lignes du tampon.

sest la commande de substitution que vous connaissez probablement déjà. Il est couramment utilisé viet présente des caractéristiques essentiellement identiques à la scommande desed , bien que certaines des fonctionnalités avancées d'expression régulière puissent varier selon la mise en œuvre. 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) eximplémentations, vous pouvez également utiliser une -coption supplémentaire , comme ceci:

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

Cependant, cela n'est pas requis par POSIX.

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


1
+1 pour l'utilisation de l' ex
Jeff Schaller

1
Il n'édite pas sur place. Au moins, il ne fait pas plus que sedle faux -n de Gnu . Il lit / écrit dans les tampons sur disque. Voyez par vous-même w / ex -ret la preservecommande.
mikeserv

@mikeserv Quelle est la preservecommande?
Mateen Ulhaq

2

Manière python très rapide, simple et sale:

#!/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
Puis-je s'il vous plaît connaître la raison du vote négatif?
Sergiy Kolodyazhnyy

3
Cela fonctionne, mais il s'en fiche .com, il supprime simplement tout en commençant par le premier /de la ligne. (qui est à mon avis encore la meilleure approche!)
Byte Commander

1
@ByteCommander exactement à droite! Si le nom de domaine est .net, dans d'autres approches, la partie qui vient après le domaine et l'extension ne serait pas supprimée, il est donc plus sûr de l'utiliser /comme séparateur.
Sergiy Kolodyazhnyy

+1 pour la réponse et les commentaires qui me donnent l'impression d'être sur AskUbuntu.com: D
WinEunuuchs2Unix
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.