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

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

教科書でこのコードを見つけましたが、その本には1,/^[ ]*$/d 「1 行目から最初の空白行まで削除する」という意味しか書かれていません。それぞれの文字は具体的にはどういう意味ですか?

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

答え1

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

/^[ ]*$/行の[ ]*先頭から^末尾まで0 個または任意の数のスペースを含む行に一致します。$
質問内のコードが意図的なものなのか、本からの正確なコピーなのかは不明です。 1 つのスペースを囲む括弧は不要です。 おそらく、元の著者は括弧の間にスペースとタブ文字を入れたかったのでしょうが、これは文字クラス に置き換えることができます[[:blank:]]

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

wファイルを書き込む

qエディターを終了する

これらのコマンドはedここに文書は で示されます<< EOFEOF文字列は、他の 4 行と対になる半任意の名前ですEOF。 を引用符で囲まEOFないと、その間の行にある変数はすべて展開されます。

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

答え2

コマンドと入力

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

詳細な説明1,/^[ ]*$/d

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

次の行でw変更を書き込み、q終了しますed

効果

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

関連情報