私はこれを持っています:
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
しかしどちらも機能しませんでした(エラーなし)。
私はこれを持っています:
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
しかしどちらも機能しませんでした(エラーなし)。
回答:
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
;ます。
;。
sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
編集1:
これを説明することになっているので...
これは不必要に複雑です。内でアドレス範囲が許可されていることを知りませんでした{}。そのため、「空行を削除する」という表現を変える必要がありました。コアコマンドはt、sedの方法ですif ... then。Tより簡単だったでしょうが、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意味し、「最初の角括弧の内容」を意味します。