プログラム出力のログファイルを保存します。問題は、アーカイブしたくない非常に長い行の7ビットASCIIデータ(エンコードされたバイナリ)をダンプするときにエラーが発生することがあることです。改行文字に達するまで、行の長さは200KBを超えることがあります。
短くパイプ可能な方法は何ですか?sed
行の最初の80文字と最後の40文字のみを保持し、250文字を超える行のみを変更します。_?
答え1
sed では、すべてのコマンドには、そのコマンドが適用される行を示す条件をプレフィックスで付けることができます。一般的な条件の1つは検索パターンです。検索パターンは、/.\{250\}/
250 文字を超える文字を含む行と一致します。これらの行では、最初の80文字と最後の40文字を一致させ、行__
全体を接頭辞と接尾辞に置き換えます。
sed -e '/.\{250\}/ s/^\(.\{80\}\).*\(.\{40\}\)$/\1__\2/'
十分に長い行だけが一致するように代替コマンドのパターンを並べ替えることもできます。
sed -e 's/^\(.\{80\}\).\{130,\}\(.\{40\}\)$//'
答え2
私はそれについてあまり知らないので、sed
私の解決策は奇妙です。
awk 'length>250{len=length;$0=substr($0,1,80) "_" substr($0,len-40+1)};1' file
答え3
以下は、これを実行できるawkコマンドです。
awk 'len=length{if(len>250){print substr($0,0,80),"__",substr($0,len-40,len)}else{print $0}}' data.txt
説明する:
行が250文字を超えると、最初の80文字が印刷され、その後に文字列が続きます。___その後、最後の40文字が出ます。
行が250文字未満の場合は、元の行を印刷するだけです。
答え4
1行の最初の80文字と最後の40文字を抽出するパイプライン方法がありますが、「ifステートメント」がないため、sedで文字列の長さを直接テストしてからこれを行うことはできませんsed
。sed
最初の80文字と最後の40文字をキャプチャします。みんな完成のためにラインを使用できます| sed -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/'
。
sed -i -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/' logfile
内部変更はファイルに対して行われますが、すべての行でのみ行われます。