コマンド結果のフィルタリング

コマンド結果のフィルタリング

プログラム内で次のコマンドを実行すると、小さなプログラムを書くのに問題があります。

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

私は得る:

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

しかし、これは次のようになります。

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

それ以外の場合、プログラムは実行されません。誰でも私を助けることができますか?

プログラム:

#!/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/

答え1

コマンドの出力がgsettings一致します。GVariant テキスト構文。このパラメータはひも、一重引用符で印刷します。

引用符を削除する必要があります。

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

これによりURIが得られます。ファイル名に特殊文字が含まれていない場合は、先頭file://file:)のみを削除してください。

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

答え2

Ubuntu 12.10でこのコマンドを実行すると、次の結果が表示されます。

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

次のように保存された値をクリーンアップします$dir

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

file://これにより、文字列が最初から切り捨てられます。他の結果が表示されたら、この設定を変更できます。あなたの場合:

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

詳細

上記はパターン置換を使用して${var/pattern/}変数からパターンを削除します。pattern$var

代替

@jthillはまた、Bashの「一致パターンプレフィックスの削除」表記を使用する良い提案をしました。私の考えでは、理解するのは少し難しいですが、同じように効果的です。

はい

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

\'file://上記は、からプレフィックスを削除し、チェックマークに置き換え、残り$dir'$dir'file://

バッシュのマニュアルページ

Bashのこれらの機能についてもっと知りたい場合は、そうすることをお勧めします。上記で使用した関数です。

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.

フォローアップ質問#1

OPは以下のコメントで次の質問をしました。

今、次の問題に直面しました。 「/home/thamara/.config/variety/Downloaded/wallbase_type_all_order_random_nsfw_1‌00_board_1/wallpaper-2249773.jpg」イメージを開くことができません。

気づいたら、問題は文字列の末尾に2つのティックがあることです。これがなぜそこにあるのかはわかりませんが、次のティックを削除するには、以前にsed提供した代替コマンドの直後にこのコマンドを使用できます。 Bashの交換機能を使用して、最後に2つの単一ティックを処理する方法を見つけることができません。

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''

$ 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'

答え3

//ファイル名の先頭にある余分な2つを削除し、''奇妙なことにファイル名の末尾にあるものを削除したい場合は、次のようにしますsed

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

これにより、無効なインスタンスまたは重複エントリが置き換えられ、///削除されます。最後に、ファイル名にスペースが含まれている場合は、行の先頭と末尾にスペースを追加してファイル名を適切にカプセル化します。このソリューションは少し長いですが、作業を正しく実行する必要があります。/''

私も何かを鳴らすでしょう持続可能な開発管理言及して言うと、私が走ったとき:

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

私が得た結果は次の形式です。

'file:///usr/share/backgrounds/warty-final-ubuntu.png'

関連情報