2

munin スクリプトをコーディングしている間、パスを探して構成ファイルを解析しなければならないことがよくあります。

強力なマークアップのない (つまり、XML ではない) 構成ファイルの問題は、これらのパスが複数の構文を持つ可能性があることです。

  • 一重引用符 (') または二重引用符 (") または引用符なし
  • スペースを含む (文字列が引用符で囲まれていない場合はエスケープされます)
  • 引用符を含む (通常は一重引用符)

たとえば、パスを抽出するために次の行を解析する方法を探しています (今回は最初の位置にあります)。

/mnt/DirWithoutSpaces/ "Dir1" cnidscheme:dbd perm:0775 options:usedots,upriv
/mnt/Dir\ With\ Space/ Dir2 cnidscheme:dbd options:usedots,upriv
"/mnt/Dir With Space And D-quote" Dir3
'/mnt/Dir With Space And S-quote' Dir4
~/ "Dir 5" cnidscheme:dbd
"/mnt/Dir'ed" "Dir 6" cnidscheme:dbd

私は通常、EREand =~bash 演算子 ( [[ $string =~ $pattern ]]) を使用しますが、そのたびに頭が痛くなります。

変数マングリング , cut,awkのいずれかsedが非常に役立ち、引用符やその他のものを自動的に処理できると確信していますが、その特別な魔法のレシピを見つけることができません.

4

2 に答える 2

3

-P (--perl-regexp)でオプションを試すことができますgrep

$ grep -oP "^(\\\\ |[^ '\"])*" input.txt
/mnt/DirWithoutSpaces/
/mnt/Dir\ With\ Space/
~/

$ grep -oP "^(['\"]).*?\1" input.txt
"/mnt/Dir With Space And D-quote"
'/mnt/Dir With Space And S-quote'
"/mnt/Dir'ed"

$ grep -oP "^(['\"]).*?\1|^(\\\\ |[^ '\"])*" input.txt
/mnt/DirWithoutSpaces/
/mnt/Dir\ With\ Space/
"/mnt/Dir With Space And D-quote"
'/mnt/Dir With Space And S-quote'
~/
"/mnt/Dir'ed"
于 2012-04-13T02:23:19.510 に答える