web-dev-qa-db-fra.com

Comment obtenir le premier mot d'une chaîne?

Quand je echo * J'obtiens la sortie suivante:

file1 file2 file3 ...

Ce que je veux, c'est choisir le premier mot. Comment puis-je procéder?

51
vdegenne

Vous pouvez le diriger à travers awk et lui faire écho au premier mot

echo * | head -n1 | awk '{print $1;}'

ou vous coupez la chaîne et sélectionnez le premier mot:

echo *  | head -n1 | cut -d " " -f1

ou vous le canalisez et le faites supprimer tout sauf le premier mot

echo * | head -n1 | sed -e 's/\s.*$//'

Ajout du | head -n1 pour satisfaire les piquants. Dans le cas où votre chaîne contient des sauts de ligne | head -n1 sélectionnera la première ligne avant que les commandes importantes sélectionnent le premier mot de la chaîne qui lui est passée.

63
Bananguin

En supposant un shell posixy (/bin/sh ou /bin/bash peut le faire)

all=$(echo *)
first=${all%% *}

La construction ${all%% *} est un exemple de suppression de la sous-chaîne . Le %% signifie supprimer la plus longue correspondance de * (un espace suivi de n'importe quoi) à l'extrémité droite de la variable all. Vous pouvez en savoir plus sur la manipulation de chaînes ici .

Cette solution suppose que le séparateur est un espace. Si vous faites cela avec des noms de fichiers, tous les espaces le briseront.

25
starfry

En supposant que vous voulez vraiment le premier nom de fichier et non le premier Word, voici un moyen qui ne casse pas sur les espaces:

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"
9
Chris Down

Vous pouvez utiliser les paramètres positionnels

set -- *
echo "$1"
6
glenn jackman

Cochez l'une des alternatives suivantes:

$ FILE=($(echo *))
$ FILE=$(echo * | grep -o "^\S*")
$ FILE=$(echo * | grep -o "[^ ]*")
$ FILE=$(find . -type f -print -quit)

Ensuite, vous pouvez l'imprimer via echo $FILE.

Voir aussi: grep le seul premier mot de la sortie?

3
kenorb

Cela marche:

echo * | grep -o "^\w*\b"

Creds à https://unix.stackexchange.com/a/57879/392

2
Alexander

Obtenir le premier nom de fichier entier:

shopt -s nullglob
printf '%s\000' * | grep -z -m 1 '^..*$'
printf '%s\000' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
1
markle