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
그러면 행이 배열 :
로 분할되고( 분할할 문자를 설정하고 자동 분할이 켜짐 ) 인용문의 각 면이 인쇄됩니다. 한 줄에 두 개 이상 이 있으면 깨지지 만 그런 일은 일어나지 않을 것 같습니다 . 그러나 파일의 모든 빈 줄도 인쇄됩니다. 이를 방지하려면 먼저 파이프하십시오 .@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
다시 포맷했으며 원래 포맷된 출력을 최대한 많이 유지했습니다. 예를 들어 이름 멤버 주위에 두 개의 문자(큰따옴표)를 삽입해야 하기 때문에 선행 탭도 삽입할 때 실제 탭 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 정의 사이에 빈 줄이 있다고 가정합니다.