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