5行目から始まる空行を削除する方法


10

私はこれを持っています:

sed -i '/^$/d' temp_spec.rb

これは空白行を取り除き、うまく機能します。これを5〜999行(または理想的には5からファイルの終わりまで)の行でのみ実行するにはどうすればよいですか。

私は試した:

sed -n5,999 -i '/^$/d' temp_spec.rb
sed '5,999!d/^$/d' temp_spec.rb

しかしどちらも機能しませんでした(エラーなし)。


ドゥあなたがしたい:ちょうど確かに保つ 1〜4行を、彼らは空白またはでない、またはあなたがしたいですかに関係なく削除する 1〜4行を、彼らは空白になっているかどうかに関係なく?(これまでのところ、前者を想定しましたが、2番目に実行したコマンドは不思議です。)
Uwe

回答:


12

5行目から始まるすべての空白行を削除し、1行目から4行目まで保持する場合は、次のように使用できます

sed -i '5,${;/^$/d;}' temp_spec.rb

{グループ化演算子であるので、最初のコマンド5,${「(入力終了までライン5から手段$)一致するまで次のコマンドを実行}」。間のコマンド{}再びアドレス、インナーコマンドで始まることができる/^$/d手段「から始まるとの間には何も(存在しない場合^)とend( $)ラインの、それを削除します」。sedコマンドはで区切ることができます;。(これはsedの不適切に文書化された機能です。ほとんどのsed実装でサポートされていますが、完全に移植可能ではありません。)Haukeが述べたように、;{はオプションです。}ただし、前のものは必要です。

5行目から始まるすべての空白行を削除し、1行目から4行目も削除する場合は、簡単です。

sed -i '1,4d;/^$/d' temp_spec.rb

いいね。アドレスがそのようにネストできることを知りませんでした。私にとっても、先頭なしで動作し;ます。
Hauke Laging 2013年

うん、あなたは最初について正しいです;
Uwe 2013年

@Hauke Laging sedスクリプトのコマンドは「;」で区切ることができます。代わりに別の行に配置します。これは「文書化されていない」機能です。
Predrag Punosevac 2013年

4

awkを使用する別のオプション:

awk 'NR<5||/./'

2
sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb

編集1:

これを説明することになっているので...

これは不必要に複雑です。内でアドレス範囲が許可されていることを知りませんでした{}。そのため、「空行を削除する」という表現を変える必要がありました。コアコマンドはt、sedの方法ですif ... thenTより簡単だったでしょうが、GNU sedでのみ利用可能です。私はmanページを引用します:

t label:最後の入力行が読み取られてから、および最後のtまたはTコマンド以降にas ///が正常に置換された場合、labelに分岐します。ラベルが省略されている場合、スクリプトの最後に分岐します。

私は有名なsコマンドを悪用します。何も置き換えず、行が空かどうかのみをテストします。したがって、空の行を空の行に置き換えます(とにかく行が削除されるため、置換として何でも使用できます)。

s「置換」を行った場合、その行は空です。その場合、コマンドdが実行されます。それ以外の場合は何も行われません。tの場合にはジャンプしないs私は、分岐命令を必要とするアクションbスクリプトの最後にジャンプします。: labelブランチターゲットです。同様goto当時(SEDが発明された... TE煕)暗黒の年齢インチ

別のオプションはs、空でないすべての行を「置換」してs、コマンドのより複雑で残りの部分を簡単にすることです。

sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input

^..*$「空でない行」を\1意味し、「最初の角括弧の内容」を意味します。


OPのための少しの説明(私は彼らの脳がこれを読んで耳から
這い出そ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.