cat /proc/cpuinfo
aの全項目をJSONに変換したいと思います"key" : "value"
。
可能ですか?私は\n
各行を取得できるようにしたいので、文字列分解を使用しようとしています。その後、各行を使用できます:
。
しかし、改行文字は一貫性のない配列を生成するようです。
答え1
簡単な方法で次のようにすることができます。
sed 's/\(.*\)\t:\(.*\)/"\1" : "\2"/' /proc/cpuinfo
これにより、タブの前のすべての項目と一致し、コロンが続き、として保存され、\1
コロンの後のすべての項目が一致してとして保存されます\2
。代わりに、周囲に引用符があります。
ただし、これにより次のような結果が得られます。
"fpu " : " yes"
power management:
タブの前に余分な空白がある項目には空白が含まれ、空の項目は無視されます。このバージョンのPerlは、次の問題を正しく処理します。
perl -F: -alpe 's/.*/"$F[0]" : "$F[1]"/' /proc/cpuinfo
これにより、行が配列:
に分割され(分割する文字を設定して自動分割がオンになり)、引用符の各面が印刷されます。 1行に2つ以上があると割れますが、そんなことは起こらないようです。ただし、ファイル内のすべての空白行も印刷されます。これを避けるためには、まずパイプしてください。@F
-F
-a
@F
:
/proc/cpuinfo
grep
grep . /proc/cpuinfo | perl -F: -alpe 's/.*/"$F[0]" : "$F[1]"/' /proc/cpuinfo
または、行に以下が含まれている場合にのみ印刷してください:
。
perl -F: -alne 's/.*:.*/"$F[0]" : "$F[1]"/ && print' /proc/cpuinfo
答え2
sed -n '/./s/ *\(\( *[^:[:blank:]]\)*\)[^:]*\(:*\)/"\1"\3/gp' /proc/cpuinfo
sed
... GNUショートカットを使用すると、ほぼ同じステートメントを作成できます。たとえば、次のようになります。
sed -En 's/ *(( ?[^ :\t])+)\s*(:?)/"\1"\3/gp' /proc/cpuinfo
これは少し悪いです。(数回のキー入力でより良いことができるからですjw
)、でも遊んでいますsed
...
set ' ' $'\\\n' $'\n' ' '
sed -En "\$c$2$1}$2]${3}1ccpus$1=$1[$2$1{$3/^$/c$2$1},$2$1{
s/ *(( ?[^ :\t])+)(\s*:\s*)?\s*/\"\1\"\3/g
s/\"(([yn]).s?|([0-9]+))\"$/\3false\2true/
s/falsey|ntrue|([0-9])f\w+$/\1/
/^.flags./{
s/\s*:\s*/$1=$1[/;h
s/.*\t.//;x;s/(.*\t.).*/\1/;x
s/ /\",$2\"/g
s/^/pr -to24 -a4 <<''$2/e;H;x
s/$/$2$1$1]/
}; s/.*/$1$4&,/p" /proc/cpuinfo
私考える出力はほぼ有効です。端末ウィンドウと同じようにブラウザウィンドウでタブを整列できないようで、写真を撮りました。
とにかく、ほとんどのフォームは詐欺されています。pr
それとも詐欺ですか?バナーGNUコマンドと残りの部分でsed
e
再フォーマットし、元のフォーマットされた出力をできるだけ維持しました。たとえば、名前メンバーの周囲に2つの文字(二重引用符)を挿入する必要があるため、前のタブも挿入するときに実際のタブ1つとスペース6つに設定して、おおよその現在のタブ停止位置を維持したいとします。
最初のハッシュは次のとおりです。
答え3
私のバージョン:
#!/usr/bin/env perl
use strict;
use warnings;
use JSON;
use Storable qw(dclone);
my ( %h, @cpu );
while (<>) {
chomp;
if (m/^$/o) {
push @cpu, dclone( \%h );
undef %h;
next;
}
my ( $k, $v ) = split /\s*:\s*/, $_, 2;
if ( !defined $v or $v eq '' ) { $h{$k} = undef }
elsif ( $k eq 'flags' ) { $h{$k} = [ split /\s/, $v ] }
elsif ( $v =~ /^\d+$/o ) { $h{$k} = int ($v) }
elsif ( $v eq 'yes' ) { $h{$k} = \1 }
elsif ( $v eq 'no' ) { $h{$k} = \0 }
else { $h{$k} = $v }
}
print JSON->new->pretty->encode( \@cpu );
これは、各CPU定義間に空行があると仮定します。