0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

lsの出力をJSON配列にする

Last updated at Posted at 2024-06-16

問題

lsの出力結果をJSON配列にしたいとします。たとえば、

$ ls
bin  games  include  lib  lib32  lib64  libexec  libx32  local  sbin  share  src

から、

["bin", "games", "include", ..., "src"]

を生成するわけです。

jqを使う

いろいろ試してみましたが、コマンドライン志向のJSONパーザーであるjqを使うのが一番楽でしょう。こうです。

$ ls | jq -Rsc 'split("\n")[0:-1]'
["bin","games","include","lib","lib32","lib64","libexec","libx32","local","sbin","share","src"]

配列化してしまえば、要素単位の処理は簡単です。たとえば、ファイル/ディレクトリ名を項目にしたHTMLリスト(<li></li>)を作成するなら、こうします。

$ ls | jq -Rsr 'split("\n")[0:-1] | map("<li>" + . + "</li>")[]'
<li>bin</li>
<li>games</li>
...
<li>share</li>
<li>src</li>

解題

lsのファイル名は二重引用符で囲まれていないので、JSON文字列としては文法違反です。そこで、-Rオプション(ロングフォーマットは--raw-input)を使って、強制的に文字列として読み込ませます。

$ ls | jq -R '.'
"bin"
"games"
...
"share"
"src"

この結果では、各ファイル名がそれぞれ独立したJSONテキストとして扱われます。配列化するにはこれらをひとまとめにしなければなりません。それには-s--slurp)を使います。複数のテキストが入力されたら、それらを1つの大きな文字列として扱えという指示です。

$ ls | jq -Rs '.'
"bin\ngames\ninclude\nlib\nlib32\nlib64\nlibexec\nlibx32\nlocal\nsbin\nshare\nsrc\n"

ばらばらだった行が\nをデリミタに連結されました。あとは、これをsplitで分解し、配列にします。

$ ls | jq -Rs 'split("\n")'
[
  "bin",
  "games",
  ...
  "share",
  "src",
  ""                                       # ここ余分
]

末尾に空文字の要素があります。これは、最後の行の改行コード("src\n")の次の文字を指しています。不要なので、末尾の要素はスライスで取り除きます(形式はPythonとかでおなじみです)。

$ ls | jq -Rs 'split("\n")[0:-1]'
[
  "bin",
  "games",
  ...
  "share",
  "src"
]

コマンドオプションに-c--compact-output)を加えると、横1列に出力してくれます。ま、見栄えの話です。

$ ls | jq -Rsc 'split("\n")[0:-1]'
["bin","games","include","lib","lib32","lib64","libexec","libx32","local","sbin","share","src"]

おわりに

最初はawkを使ってみましたが、最後のカンマが面倒で途中で挫折しました。ifとか入れるとややこしくなるし...

$ ls | awk 'BEGIN {print "["} {print "\""$0"\","} END{print "]"}'
[
"bin",
"games",
...
"share",
"src",                                     # あああ、これが。
]

readarrayとかも考えたけど、これもループを組むのが面倒なので、やっぱり挫折しました。イテレータが使えるjqはやっぱりこういうときに便利です。

参考

表紙 表紙

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?