5

複数の空白行を 1 行に置き換える sed スクリプトを作成しましたが、想定どおりに動作しません。理由を説明してくれる皆さんに感謝します。実際の例を参照しないでください。私は Google に精通しています。sed の仕組みを理解したいだけです。

コードは

sed ':a;/^\n*$/{N;ba};s/^\n\n*/\n/' input_file

ロジックは単純です。sed が行を読み取り、その行が空白であるか、複数の改行記号がある場合 (これが/^*\n$条件です)、sed に次の行をパターン スペースに追加するように指示します。空白でない行が見つかるとすぐに、置換s/^\n\n*/\n/が行われます。

ファイルの最後に空白行がある場合を除いて、すべて正常に動作します。これらの空白は単一の空白に置き換えられず、その理由がわかりません。

何か案は?

4

2 に答える 2

7

次の行を読んでいるときに問題が発生しsedています。EOF

を使用して次の行を読み取るときに、コマンドが完了しNます。なぜなら、次の行を読んでいる間sedEOF. s/^\n\n*/\n/そのため、置換は処理されません。そのため、ファイルの最後に表示された一連の空行を削除することはできません。

私の解決策は次のとおりです。

sed ':a; /^\n*$/{ s/\n//; N;  ba};' yourfile
于 2014-07-16T13:38:50.623 に答える
1

の代わりに\n\n*、使用できます\n+

ところで、これは Perl のワンライナーとしてどのように見えるかです:

perl -0777 -pe 's/\n+/\n/g' yourfile

または、同じ結果で置換が少ない場合:

perl -0777 -pe 's/\n\n+/\n/g' yourfile

または、さらに魔法のように、@hwnd が提案するこのコンパクトなソリューションを試してください。

perl -00 -pe ''
于 2014-07-16T12:53:45.740 に答える