2014-01-19 142 views
1

我有一個需要解析的json文件。 使用像sed/awk或perl這樣的腳本,如何提取value30並將其替換爲以字符串「XX」爲前綴的value6(例如.XX + value30)。 其中:使用sed或perl解析JSON文件

  • 字段6 =固定字符串
  • value6 =固定字符串
  • 值30 =不同的字符串
[ 
    {"field6" : "value6", "field30" : "value30" }, 
    { "field6" : "value6", "field30" : "value30" } 
] 
+3

三個字;不不不。 – tripleee

+3

那麼,有了適當的JSON庫,Perl應該沒問題,實際上。 – tripleee

+3

不要手動做。使用像[Perl JSON]這樣的模塊(http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm#decode_json) – grebneke

回答

3

如果我理解正確的話,這個程序應該做的你在做什麼:

use JSON qw(decode_json encode_json); 
use strict; 
use warnings; 

# set the input line separator to undefined so the next read (<>) reads the entire file 
undef $/; 
# read the entire input (stdin or a file passed on the command line) and parse it as JSON 
my $data = decode_json(<>); 

my $from_field = "field6"; 
my $to_field = "field30"; 

for (@$data) { 
    $_->{$to_field} = $_->{$from_field}; 
} 

print encode_json($data), "\n"; 

它依靠的JSON模塊上安裝,您可以通過cpanm安裝(這應該是最現代的Perl發行版中提供):

cpanm install JSON 

如果程序文件substitute.pl和你的JSON中陣列是data.json,那麼您可以運行它:

perl substitute.pl data.json 
# or 
cat data.json | perl substitute.pl 

應該產生:

[{"field30":"value6","field6":"value6"},{"field30":"value6","field6":"value6"}] 

替換field30的值爲field6's。

這是你正在嘗試做什麼?

+1

fyi'encode_json'和'decode_json'優於'to_'和'from_',因爲它們正確處理utf8。 –

+3

另外cpan plus已經不在時尚之列(並且在最新的Perl版本中脫離核心)。核心'cpan'客戶端將會很好,現在通常首選'cpanm'(cpanminus)。 https://metacpan.org/pod/cpanm –

+0

非常感謝您提供有用的見解,最佳實踐以及Kyle的示例代碼。我會把它們拼湊起來。 – DPC