教科書でこのコードを見ましたが、本では1,/^[ ]*$/d
「1行目から最初の空白行まで削除」を意味すると言いました。各文字の具体的な意味は何ですか?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
答え1
1,/.../
最初の行から間のパターンに一致する行までの範囲を表します/
。
/^[ ]*$/
[ ]*
^
行の先頭から最後まで、ゼロまたはスペースを含む行を見つけます。$
問題のコードが意図的なものなのか、本の正確なコピーなのかは不明です。単一のスペースの周りに括弧は必要ありません。おそらく、原作者は、文字クラスで置き換えることができる括弧の間にスペースとタブを望んでいたかもしれません[[:blank:]]
。
d
行を削除するコマンドです。
w
ファイルの書き込み
q
エディタの終了
このコマンドはed
通過します。ここのドキュメント、で表されます<< EOF
。この文字列は、下の他の4行とペアになっている半無意識の名前ですEOF
。EOF
引用符がない場合は、EOF
中間行のすべての変数が拡張されることを意味します。
ここで注意すべきもう1つのことは、例が引用されていないことです$1
。 / scriptコマンドは、ed
最初の位置引数(スクリプトまたは関数の引数)に対して実行されます。追加のスペース分割とファイル名の生成の影響を受ける。この主張は実際に引用されなければなりません。詳細については、次を参照してください。スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?そしてbash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク。
答え2
コマンドと入力
は$1
編集するファイルの名前で、EOF間の内容はすべてですed
。
ブローバイブローの説明1,/^[ ]*$/d
1,
行から始める1
この場合、検索文字列が最初に表示されるまで続きます。/
文字列を検索したいことを示します。^
ファイルの行の先頭に一致させることを意味します。[
多くの文字を指定するという意味です。- '
'私たちはスペースを一致させたいです。通常、ここにはより多くの文字があります。
]
指定された文字を完成*
[]
0個以上の空白(または間のすべての文字)を一致させようとします。$
ファイルの行末まで/
検索を閉じるd
この行を削除
その後、次の行でw
変更を記録してからq
終了しますed
。
影響
ファイルの最初の行()が空の場合、または$1
空白(タブなし)のみが削除されます。