大きなテキストファイルに表示される次の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に感謝します。