4

異なるファイルから複数の一致を grep する bash スクリプトを作成する必要があります。ファイルはすべて同じ拡張子 (.desktop) のディレクトリに含まれています。次に例を示します。

[Desktop Entry]
Icon=text-x-c++src
Name=button.cpp
Type=Link
URL[$e]=file://$HOME/Configs/button.cpp
X-KDE-LastOpenedWith=kate

一致するのは、URL、LastOpenedWith、名前、およびアイコンです。それらのすべては、次の構文に従って、xml ファイルに出力される別の変数 (例: $Name、$URL など) に格納する必要があります。

<action label="$Name" icon="$Icon" exec="$LastOpenedWith $URL"/>

すべての .desktop ファイルに対して単一のエントリを作成します。

私はbashスクリプトの初心者なので、これを行う方法がまったくわかりません。どんなヒントでも歓迎します:)

4

4 に答える 4

1

このようなものがうまくいくかもしれません:

echo -e "<menu>\n<submenu>" > output.xml
for f in *.desktop; do
  Icon=$(awk -F= '/Icon/{print $2}' "$f")
  Name=$(awk -F= '/Name/{print $2}' "$f")
  URL=$(awk -F= '/URL/{print $2}' "$f")
  LastOpenedWith=$(awk -F= '/X-KDE-LastOpenedWith/{print $2}' "$f")

  echo "<action label=\"$Name\" icon=\"$Icon\" exec=\"$LastOpenedWith $URL\"/>"
done >> output.xml
echo -e "</submenu>\n</menu>" >> output.xml

Config::IniFilesを使用した Perl ソリューションは次のようになります。

#!/usr/bin/env perl

use strict;
use warnings;
use Config::IniFiles;

open XML, ">/path/to/output.xml" or die $!;

print XML "<menu>\n<submenu>\n";

foreach my $file (</path/to/*.desktop>) {
  my $ini = Config::IniFiles->new( -file => "$file" );
  printf XML "<action label='%s' icon='%s' exec='%s %s'/>\n",
    $ini->val('Desktop Entry', 'Name'),
    $ini->val('Desktop Entry', 'Icon'),
    $ini->val('Desktop Entry', 'X-KDE-LastOpenedWith'),
    $ini->val('Desktop Entry', 'URL[$e]')
}

print XML "</submenu>\n</menu>\n";

close XML;
于 2013-06-25T13:40:51.000 に答える
1

あなたは Bash を初めて使うというので、解決策は次のとおりです。Python を使用してください。これははるかに優れたプログラミング言語であり、扱っているものと同じように構成ファイルを解析するように設計されたライブラリが付属しています: http://docs.python.org/library/configparser.html。XML も簡単に記述できます。また、Bash とは異なりsed、仕事を成し遂げるために 2 番目の言語を学ぶ必要はありません。Python ですべてを行うことができます。

編集:ほら、Pythonプログラム:

#!/usr/bin/env python

import ConfigParser
import sys

for filename in sys.argv[1:]: # each argument except the program name itself
  parser = ConfigParser.RawConfigParser()
  parser.read(filename)
  name = parser.get('Desktop Entry', 'Name')
  icon = parser.get('Desktop Entry', 'Icon')
  app = parser.get('Desktop Entry', 'X-KDE-LastOpenedWith')
  url = parser.get('Desktop Entry', 'URL[$e]')

  print '<action label="{}" icon="{}" exec="{} {}"/>'.format(name, icon, app, url)

そして、呼び出しプログラムがシェルスクリプトを期待しているとあなたが言ったので、違いを認識しないように「シバン行」を一番上に含めました(シェルはPythonを自動的に呼び出します)。

于 2013-06-25T13:37:59.480 に答える