2016-10-29 21 views
4

私は80以上のフィールドを持つJSONを持っています。 jqを使用して以下に述べるJSONファイルのメッセージフィールドを抽出する際に、改行文字とタブスペースを取得しています。私はエスケープシーケンス文字を削除したいと思い、sedを使って試しましたが、うまくいきませんでした。改行、タブ、改行などのエスケープシーケンス文字をJSONファイルから削除します。

サンプルJSONファイル:

{ 
"HOSTNAME":"server1.example", 
"level":"WARN", 
"level_value":30000, 
"logger_name":"server1.example.adapter", 
"content":{"message":"ERROR LALALLA\nERROR INFO NANANAN\tSOME MORE ERROR INFO\nBABABABABABBA\n BABABABA\t ABABBABAA\n\n BABABABAB\n\n"} 
} 

誰もがこの上で私を助けることができますか?あなたの入力して

+0

**あなたは**このファイルに改行やタブの文字を入れたくないのですか? 1つのファイルに複数のエントリがありますか? (あなたのQを更新してください。私はこのコメントを削除します)。がんばろう。 – shellter

+1

'-r'オプションを使用すると、' jq'はエスケープシーケンスを実際の改行やタブなどに変換します。 'jq -r .content.message file.json'? – hek2mgl

+1

いいえ改行とタブスペースを削除したい – user3792699

答えて

2

純粋jqソリューション

$ jq -r '.content.message | gsub("[\\n\\t]"; "")' file.json 
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB 

あなたはenlosing "文字を維持したい場合は、-rを省略します。

注:peak's helpful answerUnicode category specifierの道、\p{Cc}でASCIIとLatin-1のUnicodeの範囲内すべて制御文字に一致し一般正規表現が含まれています。 jqOniguruma正規表現エンジンを使用します。例えばsedtrなどの追加のユーティリティを用い


他の解決策、、。しかし、囲み"がまだそこにあることを

$ jq '.content.message' file.json | sed 's/\\[tn]//g' 
"ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB" 

注:無条件エスケープシーケンス\ntを削除するsedを使用し

$ jq '.content.message' file.json | sed 's/\\[tn]//g; s/"\(.*\)"/\1/' 
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB 

も囲む"(注:出力が無\n後続た):削除シンプルなオプション:-rがどのように

$ jq -r '.content.message' file.json | tr -d '\n\t' 
ERROR LALALLAERROR INFO NANANANSOME MORE ERROR INFOBABABABABABBA BABABABA ABABBABAA BABABABAB 

注意、それらを削除sedコマンドに別の置換を追加するには jqの文字列(\n\tのシーケンスを展開する)に挿入し、リテラルとしてで削除します。

+0

私は既に私の質問で、私は新しい行やタブスペースのようなエスケープシーケンス文字を削除したいと言っています。 – user3792699

+0

それを入手しました。私の更新を見てください。 – mklement0

+1

それは働いた。ありがとう@ mklement0 – user3792699

3

、以下の呪文:

$ jq 'walk(if type == "string" then gsub("\\p{Cc}"; "<>") else . end)' 

を生成します。もちろん

{ 
    "HOSTNAME": "server1.example", 
    "content": { 
    "message": "ERROR LALALLA<>ERROR INFO NANANAN<>SOME MORE ERROR INFO<>BABABABABABBA<> BABABABA<> ABABBABAA<><> BABABABAB<><>" 
    }, 
    "level": "WARN", 
    "level_value": 30000, 
    "logger_name": "server1.example.adapter" 
} 

を、上記の呼び出しは、単なる例示であり:

  • あなたが使用する必要がないかもしれませんwalk/1。 (walk/1は入力JSONを処理します)
  • 異なる文字クラスを使用するか、gsub/2呼び出しのパイプラインを指定します。
  • 制御文字を消したい場合は、gsub/2の2番目の引数として ""を指定します。

あなたは、その呼び出しの前にwalk/1を使用するのではなく、あなたのJQがそれを持っていない、単に(例えばhereとして、ウェブ上で容易に入手可能)、その定義を追加したい場合。

+0

++いくつかの高度な技術については、真実では、単純な 'jq -r '.content.message |偶発的/一般化された情報によって、あなたの答えから派生する可能性のあるgsub( "[\\ n \\ t]"; "") 'file.json'解決法が不明瞭になります。 – mklement0

+0

@ mklement0 - (1)質問には「JSONファイルから」というフレーズが含まれ、多数のフィールドが記述されています。実際に何が必要なのか分からないので、一般的に役に立つ答えがより一般的に役立つだろうと思った:-))(2)「エスケープシーケンス文字」とTAB、NL、CRを具体的に述べているが、これらのコメントでは3つすべてをカバーしていません。 – peak

+0

フェアポイント - 記述自体に曖昧さがあり、記述とサンプルデータの間に矛盾があります( "改行文字とタブスペース[sic]"は "エスケープシーケンス"の横に記載されています)。私は個人的にあなたの答えが非常に役に立つとそれから学んだが、私の主張は、より文脈のより穏やかなフレーミングが助けた可能性があったということでした。 – mklement0

関連する問題