Recebo do usuário um determinado caminho de arquivo absoluto e quero criar uma variável que seja uma sequência que não inclua apenas os PRIMEIROS dois componentes do caminho do arquivo, mas sem imprimi-lo ou algo assim.
Por exemplo, o caminho absoluto pode ser:
/home/myusername/folder1/folder2/folder3
E é salvo em "target_path", e eu quero que "mydir" seja apenas:
/folder1/folder2/folder3
Tentei usar o comando cut de maneiras diferentes, mas sem sucesso.
command-line
bash
environment-variables
Vida de pi
fonte
fonte
/home/username
real$HOME
do usuário que está chamando? se assim você poderia removê-lo simplesmente usandomydir="${target_path#$HOME}"
eu acho #Respostas:
Usando a manipulação de string do bash :
Portanto, a string que você deseja seria (adicionando de volta a barra inicial):
Para uma variável
a
,${a#foo}
removerá a string mais curta correspondentefoo
desde o início dea
. Portanto, removemos a string mais curta que contém três/
(incluindo a barra inicial no caminho), para remover os dois primeiros componentes do caminho absoluto.fonte
Aqui está um exemplo usando
cut
Se você precisar da liderança,
/
poderá anexar| sed 's/^/\//'
ao final da sua linha.Você precisa
-f4-
porque-d '/'
dizcut
para usar/
como delimitador entre os campos. Portanto, o primeiro campo vem antes do primeiro delimitador; nesse caso, o primeiro campo está vazio. O mesmofolder1
acontece com o quarto campo e-f4-
diz ao cut para usar todos os campos a partir do quarto.fonte
Você pode usar a expansão de parâmetros do bash da seguinte maneira:
Depois disto:
dá:
Ele funciona removendo a primeira correspondência do padrão
/*/*/
da variável target_path, usando a${target_path#pattern}
sintaxe de expansão do parâmetro shell. Infelizmente, isso remove o primeiro/
caractere, e é por isso que esse caractere deve ser incluído explicitamente ao definir a variável myvar.Aviso: você deve verificar se a variável target_path contém alguns caracteres e tem mais de dois segmentos de caminho antes de usar este método. Por exemplo
target_path=/home/username/
, se , entãomyvar=/
. Isso pode ser perigoso para o seu sistema se você estiver executando algo parecidorm -rf "$myvar"*
. Não tente isso!fonte