有人可以解释一下这段删除文件顶部所有前导空白行的代码吗:
sed '/./,$!d' file
我知道它是一个正则表达式,仅匹配第一个字符,但不理解 ,$!d 部分。这是它被取代的东西,还是它们是比赛的选项?
如果它不以“s/”开头...,这还是一个搜索命令吗?
答案1
sed '/./,$!d'
从包含字符(空白或非空白)的第一行到文件末尾 - 否定(这意味着从文件开头到包含字符的第一行之前的行) - 删除。
这会删除前导空的行,而不是空行。要删除前导空白行(空行或仅包含空白字符的行),请说'/\S/,$!d'
。
阅读“Sed,简介和教程”:http://www.grymoire.com/Unix/Sed.html。然后阅读参考手册:https://www.gnu.org/software/sed/manual/sed.html。
简而言之:
命令的一般形式
sed
是[选择器][否定]命令[标志](方括号表示可选部分)选择器(如果存在)选择命令应用的行
如果
!
出现,则否定选择器,也就是说,使命令应用于与选择器不匹配的行。如果不存在选择器,则该命令适用于所有行。
选择器可以选择一行(按数字)或一组行(按正则表达式),或者起始行(按数字或正则表达式)和结束行(按数字或正则表达式)之间的行。
在我们的例子中,选择器
/./,$
意味着从找到匹配的第一行/./
(即至少包含一个字符)到文件末尾($
用作行号,表示文件中的最后一行)。它被 否定
!
,因此该命令适用于从文件开头到第一行匹配之前的行/./
。该命令
d
删除选定的行。