J'ai un fichier ASCII contenant des chemins de fichiers que je lis en exécutant:
while read p; do echo $p; done < filelist.txt
Le fichier contient des chemins de fichier avec le modèle suivant:
./first/example1/path
./second/example1/path
./third/example2/path
Comment puis-je obtenir une partie spécifique de la chaîne de chemin (de /
à /
), par exemple, j'ai besoin d'obtenir une sortie qui affiche:
first
second
third
et aussi
example1
example1
example2
Je suis sûr qu'il existe un moyen de le faire en utilisant des expressions régulières et sed
, mais je ne le connais pas.
command-line
bash
text-processing
mcExchange
la source
la source
| cut -d/ -f3
dans une pipe a fait l'affaire. Merci! C'est la commande complète maintenant:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Vous pouvez le faire directement dans votre
read
commande, en utilisantIFS
par exemple la variablela source
Vous pouvez utiliser
awk
la source
Si nous voulons un élément du chemin, il est préférable d'utiliser quelque chose qui peut diviser une chaîne en champs, comme awk, Couper ,python, ou perl. cependant,frapper peut également faire le travail avec la substitution de paramètres, en utilisant le remplacement de modèle et en jetant tout dans un tableau.
Nous avons maintenant un tableau d'éléments fabriqués à partir du chemin. Notez que si le chemin contient des espaces, cela peut impliquer de modifier le séparateur de champ interne
IFS
.la source
Bash et
cut
sont la voie à suivre, cependant une alternative en utilisant Perl:pour le deuxième
/
champ délimité etpour le troisième
/
champ délimité.-l
: active le traitement automatique de fin de ligne. Il a deux effets distincts. Tout d'abord, il chomps automatiquement $ / (le séparateur d'enregistrement d'entrée) lorsqu'il est utilisé avec -n ou -p. Deuxièmement, il affecte $ \ (le séparateur d'enregistrements de sortie) à la valeur d'octnum afin que toutes les instructions d'impression aient ce séparateur ajouté à nouveau. Si octnum est omis, définit $ \ à la valeur actuelle de $ /.-a
: active le mode de fractionnement automatique lorsqu'il est utilisé avec -n ou -p. Une commande de division implicite au tableau @F est effectuée comme première chose à l'intérieur de la boucle while implicite produite par -n ou -p.-n
: oblige Perl à assumer la boucle suivante autour de votre programme, ce qui le fait parcourir les arguments de nom de fichier un peu comme sed -n ou awk:-e
: peut être utilisé pour entrer une ligne de programme;print(@F[N])
: imprime le Nième champ.la source