次のようなファイルがあるとしましょう。
A random Title 1
BLOCK
1- a block of text that can contain any character
and it also can contain multiple lines
BLOCK
A random Title 2
BLOCK
2- a block of text that can contain any character
and it also can contain multiple lines
BLOCK
A random Title 3
BLOCK
3- a block of text that can contain any character
and it also can contain multiple lines
BLOCK
ファイルにはこのような複数のテキストブロックがあります。次のJSONを介してこのテキストのパラメータをデプロイしたいと思います。
[
{
"title": "A random Title 1",
"body": "1- a block of text that can contain any character\nand it also can contain multiple lines"
},
{
"title": "A random Title 2",
"body": "2- a block of text that can contain any character\nand it also can contain multiple lines"
},
{
"title": "A random Title 3",
"body": "3- a block of text that can contain any character\nand it also can contain multiple lines"
}
]
ファイル文字を1文字ずつ通過するループを作成することでこの問題を解決できることがわかり、JSONのすべての変数を正しく分割するロジックを生成できます。しかし、コマンドラインを使用するより簡単な解決策があるかどうか疑問に思います。 AWKを使用してファイルから取得したパラメータをJSON出力に配布できますか?それとも、この場合AWKが何をするのか私が誤解しているのでしょうか?
ベストアンサー1
あなたは試すことができますミラー
$ mlr --inidx --irs '\n\n' --ifs 'BLOCK' --ojson --jvstack --jlistwrap \
put -S 'for(k,v in $*){$[k] = strip(v)}' then \
cut -f 1,2 then \
rename '1,title,2,body' file
[
{
"title": "A random Title 1",
"body": "1- a block of text that can contain any character\nand it also can contain multiple lines"
}
,{
"title": "A random Title 2",
"body": "2- a block of text that can contain any character\nand it also can contain multiple lines"
}
,{
"title": "A random Title 3",
"body": "3- a block of text that can contain any character\nand it also can contain multiple lines"
}
]
パイプを使用して出力をきれいにするか、jq '.'
オプション--jvstack --jlistwrap
を省略してパイプすることができますjq -s '.'
。
$ mlr --inidx --irs '\n\n' --ifs 'BLOCK' --ojson \
put -S 'for(k,v in $*){$[k] = strip(v)}' then \
cut -f 1,2 then
rename '1,title,2,body' file | jq -s '.'
[
{
"title": "A random Title 1",
"body": "1- a block of text that can contain any character\nand it also can contain multiple lines"
},
{
"title": "A random Title 2",
"body": "2- a block of text that can contain any character\nand it also can contain multiple lines"
},
{
"title": "A random Title 3",
"body": "3- a block of text that can contain any character\nand it also can contain multiple lines"
}
]
これはcut -f 1,2
、2番目のタグが3番目の(空の)フィールドを意味するために必要ですBLOCK
。必要に応じて動詞に置き換えることができますremove-empty-columns
(後者はストリーミングではありませんが)。
本文の連続改行処理
残念ながら、上記の内容は、入力レコード区切り記号である連続改行とBLOCK
…BLOCK
本文区切り記号の間に現れる連続改行を区別しません。回避策として、入力を前処理して本文の\n
改行を順番に変更し、JSONを作成する前にリテラルの改行に戻すことができます(\n
ここでMillerはそれをエスケープします)。
sed '/^BLOCK/{:a;N;/BLOCK$/!ba;s/\n/\\n/g;}' file |
mlr --inidx --irs '\n\n' --ifs 'BLOCK' --ojson put -S '$2 = gsub($2,"\\n","\n"); for(k,v in $*){$[k] = strip(v)}' then cut -f 1,2 then rename '1,title,2,body'
sed フィルタを Miller にコマンドとして渡すことができますが、--prepipe
引用が難しくなります。