1行を数回分解し、各ステップの後に再組み立てしますが、各コマンドは出力に新しい行を追加します。
デフォルトでは、次のコマンドは次のとおりです。
h
s#(^.*?)(\[\{.*$)#\1#p
g
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#ep
g
s#(^.*?\}\])(.*)$#\2#p
z
しかし、元の行はsedの後に3行を生成します。各行は/p
内容の後に改行を追加するためです。これをどのように避けることができますか?入力の1行は出力の1行につながる必要があります。
代わりに、フラグ付きのファイルにコマンド結果を書き込み、コマンドで読み取ろうとしましたが、ファイルの内容が出力に直接追加され、/p
同じ結果が表示されます。s
/w filename
r filename
/p
sedに-nコマンドライン引数を追加しようとしたからです。
コンテキストを追加するには、タイムスタンプ、リクエストURI、リクエストJSON本体、リクエストヘッダーで構成されるログHTTP POSTリクエストを解析しており、次のものを使用しようとしています。ジャックJSON属性の統合ソート。
答え1
あなたの質問を正しく理解したら、を使用して改行tr -d '\n'
文字を削除することができますsed
。
答え2
次のスクリプトを使用して目的の結果を得ました。
h
# Extract the first part of the input line and store it as-is
s#(^.*?)(\[\{.*$)#\1#
H
g
# (1)
s#$(\n|.)*\'##m
# Extract the second part of the input line and process it with an external command
s#(^.*?)(\[\{.*?\}\])(.*)$#echo \2 | jq --sort-keys --compact-output#e
H
g
# (1)
s#$(\n|.)*\'##m
# Extract the third (and final) part of the input line and store it as-is
s#(^.*?\}\])(.*)$#\2#m
H
g
# (2)
s#^.*$\n##m
# (3)
s#\n##mg
デフォルトでは、元の入力を保持します。スペアスペースを使用して最初にコピーし、部分h
処理結果を累積してに追加します。スペアスペース(そしてH
)。だから交換するときパターン空間そしてスペアスペース(使用g
)追加のコンポーネントを削除する必要があります(コマンド(1)を使用)。
処理が終わったら、最初の行(つまり元の入力行)を削除し(コマンド(2)を使用)、以前にコマンドで追加したすべての改行を削除しH
(コマンド(3)を使用)、印刷する前に行を効果的に再アセンブルします。します。パターン空間出力します。
sed
注:シェルコマンド呼び出しが単一ファイルの処理速度を数分で長すぎるのを待つ実際のブレーカー(処理にはいくつかのステップがかかります)であることがわかりました。