web-dev-qa-db-ja.com

edコマンド:1行目から最初の空白行まで削除します

私はこのコードを教科書から見つけました。本はそれを言うだけです1,/^[ ]*$/dは、「1行目から最初の空白行まで削除する」という意味です。各キャラクターは具体的にどういう意味ですか?

ed $1 << EOF
    1,/^[ ]*$/d
    w
    q
EOF
6
Jack Chen

1,/.../は、1行目から/間のパターンに一致する行までの範囲を意味します。

/^[ ]*$/は、行の先頭[ ]*から末尾^までの0個または任意の数のスペース$を含む行に一致します。
問題のコードが意図的なものであるかどうか、およびそれが本からの正確なコピーであるかどうかは不明です。単一のスペースの周りのブラケットは必要ありません。おそらく、元の作成者は角かっこ間にスペースとタブ文字を入れたいと考えていました。これは文字クラス[[:blank:]]に置き換えることができます。

dは行を削除するコマンドです

wファイルを書き込む

qエディターを終了します

これらのコマンドは、<< EOFで示される ヒアドキュメント を介してedに送信されます。 EOF文字列は、4行下の他のEOFとペアになっている半任意の名前です。 EOFを引用符で囲まないままにすると、間にある行の変数が展開されます。

ここで注意すべきもう1つの点は、例の引用符で囲まれていない$1です。 edコマンド/スクリプトは、最初の位置パラメーター(スクリプトまたは関数への引数)に対して実行されますが、さらに空白が分割され、ファイル名が生成されます。議論は本当に引用されるべきです。詳細については、 シェルスクリプトが空白やその他の特殊文字でチョークするのはなぜですか? および bash/POSIXシェルで変数を引用するのを忘れた場合のセキュリティへの影響 を参照してください。

4
Bodo

コマンドと入力

$1は編集するファイル名で、EOF間のすべてがedへのコマンドです。

1,/^[ ]*$/dのブロー説明

  • 1,行から開始1この場合は検索文字列が最初に出現するまで続きます
  • /は、文字列を検索しようとしていることを示します
  • ^は、ファイルの行の先頭に一致させることを示します
  • [は、これから多くの文字を指定することを示します
  • ''スペースを一致させたい-通常、ここにはもっと多くの文字があります
  • ]は文字の指定を終了しました
  • * 0個以上のスペース(または[]の間の任意の文字)に一致させたい
  • $ファイルの行末まで
  • /検索を閉じる
  • d行を削除

次に、次の行wが変更を書き込み、qedを終了します。

効果

ファイルの($1)行1が空であるか、スペースのみ(タブなし)の場合、ファイルは削除されます。

3
Colin Pearse