本文の連続改行処理

本文の連続改行処理

次のようなファイルがあるとしましょう。

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(後者はストリーミングではありませんが)。


本文の連続改行処理

残念ながら、上記の内容は、入力レコード区切り記号である連続改行とBLOCKBLOCK本文区切り記号の間に現れる連続改行を区別しません。回避策として、入力を前処理して本文の\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引用が難しくなります。

おすすめ記事