我從教科書上看到了這段程式碼;書上只說這1,/^[ ]*$/d
意味著「從第 1 行刪除直到第一個空白行」。每個字符的具體意義是什麼?
ed $1 << EOF
1,/^[ ]*$/d
w
q
EOF
答案1
1,/.../
表示從第一行到與 之間的模式相符的行的範圍/
。
/^[ ]*$/
[ ]*
符合從行首到行^
尾包含 0 個或任意數量空格的行。$
目前尚不清楚問題中的程式碼是否是故意的以及是否是書中的精確副本。單一空格周圍的括號不是必需的。也許原作者想在括號之間有一個空格和一個製表符,可以用字元類別替換[[:blank:]]
。
d
是刪除該行的命令
w
寫入文件
q
退出編輯器
這些命令ed
透過這裡的文檔,由 表示<< EOF
。該字串是一個半任意名稱,與下面的其他四行EOF
配對。EOF
不加引號EOF
意味著中間行中的任何變數都會被擴展。
這裡要注意的另一件事是範例中未加引號的$1
.命令ed
/腳本將針對第一個位置參數(腳本或函數的參數)執行受進一步的空格分割和檔案名稱產生的影響。這個論點確實應該被引用。如需進一步閱讀,請參閱為什麼我的 shell 腳本會因為空格或其他特殊字元而卡住?和忘記在 bash/POSIX shell 中引用變數的安全隱患。
答案2
命令與輸入
是$1
要編輯的檔名,EOF 之間的所有內容都是ed
.
一擊一擊的描述1,/^[ ]*$/d
1,
從線開始1
在這種情況下繼續,直到搜尋字串第一次出現/
表示我們要搜尋一個字串^
表示我們要符合文件中行的開頭[
表示我們將要指定許多字符- '
' 我們想要匹配一個空格 - 通常這裡會有更多字符
]
完成指定字符*
我們想要匹配 0 個或多個空格(或之間的任何字元[]
)$
直到文件中的行末尾/
關閉搜尋d
刪除該行
然後下一行w
寫入更改,然後q
退出ed
。
影響
如果檔案的 ( $1
) 第一行為空或只有空格(沒有製表符),那麼它將被刪除。