grep(または代替)を使用してリストを返す[閉じる]

grep(または代替)を使用してリストを返す[閉じる]

/usr/share/applications/*.desktop で、「名前」、「Exec」、および「アイコン」フィールドのリストを返そうとします。

私は走る:

  1. grep Icon= /usr/share/applications/*.desktop | cut -d '=' -f 2

    良い:リストが与えられました。

    エラー:Icon =フィールドを持たないすべての.desktopファイルをスキップしています。

    問題:「Icon =」フィールドを持たないすべてのファイルをスキップするのではなく、0を返したいと思います。どうすればいいですか?

  2. grep Exec= /usr/share/applications/*.desktop | cut -d '=' -f 2

    良い:リストが与えられました。

    悪い点:i)上記のように、Icon =フィールドを持たないすべての.desktopファイルをスキップします。 ii)これらのフィールドには、スペースの後に不要な文字(%uなど)が含まれることがよくあります。

    質問:i)上記と同じです。 ii)空白の後の文字を返さないように、コマンドに「」区切り文字を含めるにはどうすればよいですか?

  3. grep Name= /usr/share/applications/*.desktop | cut -d '=' -f 2

    良い:リストが与えられました。

    エラー:Name =のテキストだけでなく、GenericName =またはanyotherName =のテキストも返されます。

    Q:「Name =」のみが返され、他のフィールドは返されないようにコマンドを作成するにはどうすればよいですか?

編集:Mint Cinnamon 20.3を使用して単一のコマンド/スクリプトで1,2,3を同時に実行することは可能ですか、それとも他の質問の基準に合う限り、質問に対する解決策はありますか?ただ「アイコン」を変えてください。 「実行」と「名前」だけを変更してください。

ベストアンサー1

GNU awkでは、次のことができます。

gawk -F'[[:blank:]]*=[[:blank:]]*' -v key=Exec '
  BEGINFILE {value = "0"} 
  $1 == key {value = $2; nextfile} 
  ENDFILE {split(value,v,/[[:blank:]]+/); print v[1]}
' /usr/share/applications/*.desktop

他の状況に応じてキーを変更してください。

おすすめ記事