Atribuindo apenas parte de uma string a uma variável no bash

11

Eu recebo do usuário um determinado caminho de arquivo absoluto e desejo criar uma variável que será uma string que não incluirá apenas os FIRST dois componentes do caminho do arquivo, mas sem imprimir ou qualquer outra coisa.

Por exemplo, o caminho absoluto pode ser:

/home/myusername/folder1/folder2/folder3

E está guardado em "target_path" e quero que "mydir" seja apenas:

/folder1/folder2/folder3

Eu tentei usar o comando cut de maneiras diferentes, mas sem sucesso.

    
por Life of pi 10.11.2016 / 14:56

3 respostas

15

Usando a manipulação de string do bash :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

Assim, a string que você deseja seria (adicionando de volta a barra inicial):

b="/${a#/*/*/}"

Para uma variável a , ${a#foo} removerá a string mais curta correspondente a foo do início de a . Então, nós removemos a string mais curta contendo três / (incluindo a barra inicial no caminho), para remover os dois primeiros componentes do caminho absoluto.

    
por muru 10.11.2016 / 15:08
9

Aqui está um exemplo usando cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

Se você precisar do / inicial, você pode acrescentar | sed 's/^/\//' ao final de sua linha.

Você precisa de -f4- porque -d '/' informa cut para usar / como um delimitador entre campos. Então o primeiro campo vem antes do primeiro delimitador, neste caso o primeiro campo está vazio. Então, folder1 é o quarto campo e -f4- diz ao corte para usar todos os campos a partir do quarto.

    
por bc2946088 10.11.2016 / 15:07
7

Você pode usar a expansão do parâmetro bash da seguinte forma:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

Depois disso:

echo $myvar

dá:

/folder1/folder2/folder3

Funciona removendo a primeira correspondência do padrão /*/*/ de sua variável target_path, usando a sintaxe de expansão do parâmetro ${target_path#pattern} shell. Infelizmente, isso remove o primeiro caractere / , e é por isso que esse caractere deve ser incluído explicitamente durante a configuração da variável myvar.

Aviso: Você deve verificar se a variável target_path contém alguns caracteres e se tem mais de dois segmentos de caminho antes de usar esse método. Por exemplo, se target_path=/home/username/ , então myvar=/ . Isso pode ser perigoso para o seu sistema se você estiver executando algo como rm -rf "$myvar"* . Não tente isso!

    
por Arronical 10.11.2016 / 15:09