Como obter a primeira palavra de uma string?

41

Quando eu 'echo *' recebo a seguinte saída:

file1 file2 file3 ...

O que eu quero é escolher a primeira palavra. Como posso proceder?

    
por vdegenne 24.02.2013 / 12:55

7 respostas

48

Você pode canalizá-lo através do awk e fazê-lo ecoar a primeira palavra

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

ou você cortou a string e selecionou a primeira palavra:

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

ou você canaliza tudo e remove tudo, exceto a primeira palavra

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

Adicionado o | head -n1 para satisfazer os nitpickers. Caso sua string contenha novas linhas, | head -n1 selecionará a primeira linha antes dos comandos importantes selecionarem a primeira palavra da string passada a ela.

    
por 24.02.2013 / 20:08
14

Assumindo um shell posixy ( /bin/sh ou /bin/bash pode fazer isso)

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

A construção ${all%% *} é um exemplo de remoção de substring . O %% significa excluir a correspondência mais longa de * (um espaço seguido por qualquer coisa) do lado direito da variável all . Você pode ler mais sobre a manipulação de strings aqui .

Esta solução assume que o separador é um espaço. Se você estiver fazendo isso com nomes de arquivos, qualquer um com espaços irá quebrá-lo.

    
por 06.05.2015 / 12:55
7

Assumindo que você realmente quer o primeiro nome do arquivo e não a primeira palavra , aqui está uma maneira que não quebra no espaço em branco:

shopt -s nullglob
files=(*)
printf '%s\n' "${files[0]}"
    
por 24.02.2013 / 13:07
5

Você pode usar os parâmetros posicionais

set -- *
echo "$1"
    
por 24.02.2013 / 13:39
2

Verifique uma das seguintes alternativas:

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

Depois, você pode imprimi-lo via echo $FILE .

Veja também: grep a única palavra da saída?

    
por 16.10.2015 / 15:14
1

Isso funciona:

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

Créditos para o link

    
por 16.10.2015 / 15:40
1

Obtendo o primeiro nome de arquivo inteiro:

shopt -s nullglob
printf '%s
shopt -s nullglob
printf '%s%pre%0' * | grep -z -m 1 '^..*$'
printf '%s%pre%0' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
0' * | grep -z -m 1 '^..*$' printf '%s%pre%0' * | ( IFS="" read -r -d "" var; printf '%s\n' "$var" )
    
por 21.03.2016 / 15:27

Tags