私はこのコードを教科書から見つけました。本はそれを言うだけです1,/^[ ]*$/d
は、「1行目から最初の空白行まで削除する」という意味です。各キャラクターは具体的にどういう意味ですか?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
1,/.../
は、1行目から/
間のパターンに一致する行までの範囲を意味します。
/^[ ]*$/
は、行の先頭[ ]*
から末尾^
までの0個または任意の数のスペース$
を含む行に一致します。
問題のコードが意図的なものであるかどうか、およびそれが本からの正確なコピーであるかどうかは不明です。単一のスペースの周りのブラケットは必要ありません。おそらく、元の作成者は角かっこ間にスペースとタブ文字を入れたいと考えていました。これは文字クラス[[:blank:]]
。に置き換えることができます。
d
は行を削除するコマンドです
w
ファイルを書き込む
q
エディターを終了します
これらのコマンドは、<< EOF
で示される ヒアドキュメント を介してed
に送信されます。 EOF
文字列は、4行下の他のEOF
とペアになっている半任意の名前です。 EOF
を引用符で囲まないままにすると、間にある行の変数が展開されます。
ここで注意すべきもう1つの点は、例の引用符で囲まれていない$1
です。 ed
コマンド/スクリプトは、最初の位置パラメーター(スクリプトまたは関数への引数)に対して実行されますが、さらに空白が分割され、ファイル名が生成されます。議論は本当に引用されるべきです。詳細については、 シェルスクリプトが空白やその他の特殊文字でチョークするのはなぜですか? および bash/POSIXシェルで変数を引用するのを忘れた場合のセキュリティへの影響 を参照してください。
$1
は編集するファイル名で、EOF間のすべてがed
へのコマンドです。
1,/^[ ]*$/d
のブロー説明1,
行から開始1
この場合は検索文字列が最初に出現するまで続きます/
は、文字列を検索しようとしていることを示します^
は、ファイルの行の先頭に一致させることを示します[
は、これから多くの文字を指定することを示します]
は文字の指定を終了しました*
0個以上のスペース(または[]
の間の任意の文字)に一致させたい$
ファイルの行末まで/
検索を閉じるd
行を削除次に、次の行w
が変更を書き込み、q
がed
を終了します。
ファイルの($1
)行1が空であるか、スペースのみ(タブなし)の場合、ファイルは削除されます。