Filtrando um resultado de um comando

1

Estou tendo problemas para escrever um pequeno programa; quando eu executo o seguinte comando do meu programa:

gsettings get org.gnome.desktop.background picture-uri

Eu recebo:

'file:///home/thamara/.config/variety/Favorites/wallpaper-2448037.jpg'

Mas isso precisa se tornar:

/home/thamara/.config/variety/Favorites/wallpaper-2448037.jpg

Ou o programa não funcionará. Alguém pode me ajudar?

O programa:

#!/bin/bash
## Blogry for GDM - Blurs your current wallpaper and puts it on your loginscreen

## Some Settings
effect='0x8' # Change this to anything you like http://www.imagemagick.org/Usage/blur/
save='~/Pictures/blur.jpg'

## Step one -  getting the current wallpaper
dir=$(gsettings get org.gnome.desktop.background picture-uri)

## Step two - Blurring the wallpaper
convert $dir -blur $effect -blur $effect -blur $effect $save

## Step three - exit (Since GDM automatically loads the new wallpaper there is no need for seting it.)
exit 0

## Links:
# http://www.imagemagick.org/Usage/blur/
    
por glaasje 16.11.2013 / 02:31

3 respostas

2

A saída do comando gsettings está de acordo com a sintaxe do texto GVariant . Esse parâmetro é uma string , impressa entre aspas simples.

Você precisa remover as aspas.

dir_uri=$(gsettings get org.gnome.desktop.background picture-uri |
          sed "s/^'//; s/'\$//; s/\\\(.\)/\1/")

Você recebe um URI. Se o nome do arquivo não contiver nenhum caractere especial, basta remover file:// no início (ou mesmo file: ).

dir=$(gsettings get org.gnome.desktop.background picture-uri |
      sed "s~^'file://~~; s~'\$~~")
    
por 18.11.2013 / 00:39
2

Quando executo este comando no Ubuntu 12.10, recebo o seguinte:

$ dir=$(gsettings get org.gnome.desktop.background picture-uri)
$ echo $dir
'file:///usr/share/backgrounds/warty-final-ubuntu.png'

Gostaria apenas de limpar o valor armazenado em $dir da seguinte forma:

$ dir="${dir/file:\/\//}"
$ echo $dir
'/usr/share/backgrounds/warty-final-ubuntu.png'

Isso truncará o file:// do início da string. Você pode mudar isso se estiver recebendo algo diferente. No seu caso:

$ dir="${dir/\/\//}"

Detalhes

O texto acima está usando uma substituição de padrão, ${var/pattern/} , que removerá pattern da variável $var .

Alternativas

@jthill também teve uma boa sugestão de usar a notação "remover o prefixo de padrão de correspondência correspondente" do Bash. É um pouco mais difícil de entender, IMO, mas funciona igualmente bem.

Exemplo

$ dir="\'${dir#\'file://}"

O texto acima está removendo o prefixo \'file:// de $dir . Ele está substituindo por um tick, ' , seguido pelo restante de $dir sem o 'file:// .

Página man do Bash

Se você quiser ler mais sobre esses recursos do Bash, eu o encorajo a fazer isso. Esses são recursos que estamos usando acima.

trechos da página man do Bash

${parameter#word}
${parameter##word}
       Remove matching prefix pattern.  The word is expanded to produce a 
       pattern just as in pathname expansion.  If the pattern matches the 
       beginning of  the  value  of  parameter, then  the  result  of  the  
       expansion is the expanded value of parameter with the shortest 
       matching pattern (the ''#'' case) or the longest matching pattern 
       (the ''##'' case) deleted.  If parameter is @ or *, the pattern 
       removal operation is applied to each positional parameter in turn, 
       and the expansion is the resultant list.  If parameter is  an array 
       variable subscripted with @ or *, the pattern removal operation is 
       applied to each member of the array in turn, and the expansion is the 
       resultant list.

${parameter/pattern/string}
       Pattern substitution.  The pattern is expanded to produce a pattern 
       just as in pathname expansion.  Parameter is expanded and the longest 
       match of pattern against  its  value is replaced with string.  If 
       pattern begins with /, all matches of pattern are replaced with 
       string.  Normally only the first match is replaced.  If pattern 
       begins with #, it must match at the beginning of the expanded value 
       of parameter.  If pattern begins with %, it must match at the end of 
       the expanded value of parameter.  If  string  is  null, matches  of  
       pattern  are  deleted  and the / following pattern may be omitted.  
       If parameter is @ or *, the substitution operation is applied to each 
       positional parameter in turn, and the expansion is the resultant 
       list.  If parameter is an array variable subscripted with @ or *, the 
       substitution operation is applied to each member of  the  array in 
       turn, and the expansion is the resultant list.

Pergunta de acompanhamento no 1

O OP perguntou o seguinte nos comentários abaixo.

now i am having the following problem.. unable to open image '/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_1‌​00_board_1/wallpaper-2249773.jpg''

O problema, se você perceber, é que há duas marcas no final da string. Eu não tenho idéia de por que eles estão lá, mas se você quiser se livrar das marcas de marcação à direita, você pode usar este comando sed logo após a substituição anterior que eu dei a você. Eu não consegui descobrir uma maneira de lidar com as duas marcas simples no final, apenas usando os recursos de substituição do Bash.

dir=$(echo "$dir" | sed "s/''/'/")

Exemplo

$ echo "$dir"
'/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_1‌​00_board_1/wallpaper-2249773.jpg''

$ dir=$(echo "$dir" | sed "s/''/'/")
$ echo "$dir"
'/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_1‌​00_board_1/wallpaper-2249773.jpg'
    
por 16.11.2013 / 03:23
0

Se tudo o que você deseja fazer é eliminar os dois% extra// no início do nome do arquivo, e o '' que aparece estranhamente no final do nome do arquivo, você pode usar sed :

dir=$(gsettings get org.gnome.desktop.background picture-uri|sed -e 's/\/\/\//\//' -e "s/'//g; s/^/'/; s/$/'/")

Isso substituirá /// por / e excluirá instâncias ou duplicatas formatadas incorretamente de ' . Por fim, ele adicionará ' no início e no final da linha para encapsular corretamente o nome do arquivo se ele tiver espaços. Esta solução é um pouco longa, mas deve fazer o trabalho corretamente.

Também vou repetir o que slm mencionou e dizer que quando eu corri:

gsettings get org.gnome.desktop.background picture-uri

Eu tenho um resultado no formato de:

'file:///usr/share/backgrounds/warty-final-ubuntu.png'
    
por 17.11.2013 / 11:01