sedを使用してキャリッジリターンを削除する

sedを使用してキャリッジリターンを削除する

大きなCSVファイルがあります。フィールドの1つにエラーがあります。このエラーはファイルに新しい行として表示されます。

これから私はNotepad ++と次のコマンドを使用して問題を解決しました。

\r";" =>";"

sedで同じことをどのように実行できますか?

私はすでに試しました。

sed -i 's/\r";"/";"/g' /path/file.csv
sed -i 's/^";"/";"/g' /path/file.csv

成功しませんでした。ここで誰かが正しいコマンドを知っているかもしれません。

ベストアンサー1

sedが1行ずつ動作することを理解することが重要です。 sedがすることは基本的にバッファにラインを読み込むことです。改行文字なし、バッファからのコマンドの実行、バッファの印刷(flagを指定していないと仮定-n)、次の行をバッファに読み込むなどの作業を行います。したがって、sedを使用して2行をマージするには、sedが一度に複数の行を処理するように明示的に強制する必要があります。これを行うにはNPおよびDコマンドを使用します。

ここで、特定の質問に対して具体的でテストされた回答を提供するには、特定の種類の入力を入力する必要がありますが、次のことはできることのいくつかの例です。

これにより、両方の行がマージされます。

sed $'N;s/[\\n\r]//g'

または、常に \r\n 行末があると確信している場合:

sed 'N;s/.\n//'

これは最善の解決策ではありませんが、問題を理解するためのよりカスタマイズされたアプローチですが、bashまたは構文を介してCエスケープをサポートする別のシェルを使用する場合は、次の作業を実行する必要があります$'str'

sed $':l;N;/\r\\n";"/{;s/\r\\n";"/";"/g;n;};bl'

または、Cスタイルのエスケープ構文がなく、\ r \ n行末がある場合(交渉できません):

sed ':l;N;/\n";"/{;s/.\n";"/";"/g;n;};bl'

これは、基本的にバッファ(N)に次の行を追加し、目的の文字列(/\r\\n";"/)をテストすることです。一致するものがない場合、スクリプトは繰り返されます(bl-->最初に定義されたタグに分岐)。:l一致するものが見つかったら、中かっこの間にある sed スクリプトを実行します。 ()をすべて()に置き換えてバッファをフラッシュし、\r\\n";"次の行()を入力します。";"s/\r\\n";"/";"/gn

もちろん、ファイルが大きく、「エラー」が頻繁に発生しない場合は、長時間実行され、多くのメモリを使用できます。もしそうなら、他のアルゴリズムを使用することができますが、あなたの質問を正しく理解していることを確認するために、あなたが直面している状況のより良い例が必要です。

また、sedについてもっと詳しく知りたい場合は、強くお勧めします。このウェブサイト背景色が最良ではないかもしれませんが、私の考えでは最高のsedチュートリアルです。

おすすめ記事