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