Script Shell Extraire une sous-chaîne

0

S'il vous plaît, je voudrais extraire la chaîne juste avant '.fr'. Voici quelques lignes de mon dossier:

g-82.text.text1.fr.worker1
g-xx.yyyyyy.zzzz.fr.worker2

Je voudrais extraire ce texte:

g-82.text.text1
g-xx.yyyyyy.zzzz

S'il vous plaît, quelle commande je dois utiliser dans mon shell script? Je travaille sur la distribution Ubuntu Trusty Tahr 14.04.1 LTS.

Merci beaucoup.

Meilleures salutations.

researcher
la source
Quel OS? Quelle coquille?
AFH
Question modifiée. Je travaille sur la distribution Ubuntu Trusty Tahr 14.04.1 LTS. Bests.
researcher
1
Il est un peu tard, parce que je devais sortir, mais il est intéressant de noter que vous pouvez le faire avec une expansion variable, à l'instar de for f in $(cat FileNames.txt); do echo ${f%.fr.*}; done. Si l’un des fichiers contient des blancs, vous devrez numériser le fichier avec while boucle à la place, par exemple while f=$(line); do echo ${f%.fr.*}; done <FileNames.txt. Notez que tous les noms de fichiers ne pas contenant .fr. sera sortie vertatim.
AFH

Réponses:

1

Vous pouvez utiliser un regex lookahead positif:

echo "g-82.text.text1.fr.worker1" | grep -Po '.*(?=.fr)'
echo "g-xx.yyyyyy.zzzz.fr.worker2" | grep -Po '.*(?=.fr)'

Documentation ici: http://www.rexegg.com/regex-lookarounds.html

elsamuko
la source
Merci beaucoup pour l'aide :) S'il vous plaît, est-il possible de faire cette variable = "g-82.text.text1.fr.worker1" | grep -Po '. * (? =. fr)'
researcher
1
VAR=$(echo "g-xx.yyyyyy.zzzz.fr.worker2" | grep -Po '.*(?=.fr)')
elsamuko
Ajustez cela pour VAR="$(...)" [ajoutez les guillemets doubles] pour être sûr dans les situations où la chaîne contient des espaces.
Hannu
1

Utilisez le sed commander.

sed 's/.fr.*//' file_name.txt

Explication: sed supprimera la partie de la ligne correspondant à l'expression régulière .fr.* de chaque ligne du fichier, laissant ainsi le contenu avant .fr.

.fr.* veux dire .fr. suivi de rien.

Ayan
la source
echo 'villafranca' | sed 's/.fr.*//' - & gt; vill
Hannu
1

Essayer
cut -d'.' -f-3 <file_name.txt

-d définit le "délimiteur de champ",
Ne le mettez pas entre guillemets, il est donc "à l'abri de bash" (certains caractères ont une signification spéciale dans bash, c'est le moyen d'éviter les ennuis)
Effet ici - & gt; divisé en . caractères.

-f définit les "champs" à conserver, = & gt; -3 = & gt; Effet ici: du début à la troisième inclus.

man cut - pour plus d'options.

Hannu
la source