sedを3行スライドウィンドウに置き換える

sedを3行スライドウィンドウに置き換える

大きなテキストファイルに表示される次の3行グループを変更するには、Sedを使用して3行スライドウィンドウを実装する必要があります。

Fax: 05.11.22.33.44<LF>
<LF>
<LF>

これで:

Fax: 05.11.22.33.44<LF>
###
<LF>

これを行うには、次のコマンドラインを試しました(sedはmsdosバッチファイルで実行されますが、私のLinux bashでは機能しません)。

sed -i ":a;$!N;s/\nFax: \([ 0-9\.]*\n\n\);tenough;$!ba;:enough/\nFax: \1###\n/;$!ba;P;D" file.txt

何が問題なの?

答え1

あなたの推測がP;D正しい。残りは、置換が成功するまでパターン空間から文字列をプルしようとする試みが失敗したことです。これは必ずしも悪いわけではありませんが、確かにスライドウィンドウではありません。
最初の行から1行をインポートしてから使用する必要があります。N;P;Dループ(したがって、パターンスペースには常に3本の行がある)と新しい行をインポートするたびに交換しようとします。

sed '1N;$!N;s/\(PATTERN\n\)\(\n\)$/\1###\2/;P;D' infile

答え2

考えるこれは最初に試した実装に近いです。

sed ':a; $q; N; s/\(Fax:.*\n\)\n$/\1###\n/; 3,${P;D}; ba'

前任者。

$ sed ':a; $q; N; s/\(Fax:.*\n\)\n$/\1###\n/; 3,${P;D}; ba' input > output
$ diff -y input output
Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44

Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
                                                              | ###

Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44
                                                              | ###

Fax: 05.11.22.33.44                                             Fax: 05.11.22.33.44

ヒントは3,${P;D}これが3行のウィンドウを維持することです(ループを介して毎回パターンスペースで1行を破棄しますが、行数が3に達した後にのみ)。

答え3

Steeldriverのソリューションには利点があります。 5つの生産ラインで動作し、7つ以上の生産ラインでも動作できます。私の例では、一致する行を探し、前の2行、一致する行と次の2行をその行の最初の部分に置き換え、既存の値を空の「リスト」値に置き換えます。

入力が切り捨てられ、最初は行の長さが2000を超えています。

Frame 64 (List 213 [(LM 0 0 836 216 112 0.681952 0.260603)])
Frame 65 (List 236 [(LM 0 0 836 216 112 0.680071 0.187739)])
Frame 66 (List 235 [(LM 0 0 836 216 112 0.678168 0.315848)])
Frame 67 (List 98 [(LM 149 129 1456 216 112 0.525970 11.970105)])
Frame 68 (List 217 [(LM 0 4 1084 216 112 0.837058 0.658243)])
Frame 69 (List 212 [(LM 0 0 1084 216 112 0.829624 0.339764)])
Frame 70 (List 218 [(LM 0 0 1084 216 112 0.829624 0.200893)])

67行目(異常値)に一致するSedコマンドは次のとおりです。

sed -re ":a; $q; N; s/(Frame .[0-9] ).*(Frame .[0-9] ).*(Frame .[0-9] ).*LM\ [0-9][0-9][0-9].*(Frame .[0-9] ).*(Frame .[0-9] ).*/\1(List 0 \[\]\)\n\2\(List 0 \[\]\)\n\3\(List 0 \[\]\)\n\4\(List 0 \[\]\)\n\5\(List 0 \[\]\)/; 5,${P;D}; ba" transform1.trf > transform2.trf

sed コマンドはフレーム 67 と一致し、出力は次のようになります。

Frame 64 (List 213 [(LM 0 0 836 216 112 0.681952 0.260603) <cut>])
Frame 65 (List 0 [])
Frame 66 (List 0 [])
Frame 67 (List 0 [])
Frame 68 (List 0 [])
Frame 69 (List 0 [])
Frame 70 (List 218 [(LM 0 0 1084 216 112 0.829624 0.200893) <cut>])

ねえhttps://trac.ffmpeg.org/ticket/6816私はこれをなぜ探しているのですか?この記事をコメントに投稿するか、解決策として投票するには評判が不足しているので、この投稿を投稿します。他の人もそれを使用することができます。だからSteeldriverに感謝します。

関連情報