我试图使用 bash 脚本删除文件中的空白行。现在,当我在 INTERNET 中搜索时,我遇到了它的两种变体。一方面,我们可以直接修改源文件,另一方面我们可以将输出存储在另一个文件中。以下是代码片段:
sed -i '/^$/d' fileName.txt
sed '/^$/d' fileName.txt > newFileName.txt
我无法理解的是如何将正则表达式 '/^$/d' 解释为空行。恐怕我不擅长正则表达式。有人可以解释一下吗?
还有其他方法吗?
/^$/d
/ - start of regex
^ - start of line
$ - end of line
/ - end of regex
d - delete lines which match
所以基本上找到任何空的行(起点和终点是相同的,例如没有字符),然后删除它们。
让我们从正则表达式的解释开始:
/^$/d
^
匹配行首和$
行尾。所以^$
将匹配空行。
您还将d
标志与sed
. 这将删除匹配的行。
并-i
切换sed -i '/^$/d' fileName.txt
使sed
就地删除线。如果你忽略它,它会将结果输出到标准输出。
/^$/d
是一个sed
删除空行的命令。它实际上是两个东西粘在一起:一个正则表达式/^$/
和一个sed
指令d
。
该/^$/
组件是一个匹配空字符串的正则表达式。更具体地说,它查找行首 ( ^
) 紧跟行尾 ( $
),即空行。如果行中有任何内容(空格或其他内容),则该模式将不匹配,因为行尾不会直接跟随行首。
d
组件是一个sed
表示“删除”的指令。在此用法中,d
适用于与给定正则表达式 ( /^$/
) 匹配的任何行,因此它将删除任何空行。
因为sed
在自动打印模式下运行(没有-n
开关),它将打印所有未删除的行——因此,在这种情况下不匹配/$^/
——因此该命令最终成为一个过滤器,从输入。
/^$/
: 选择空行(^
匹配行首,$
匹配行尾,因此这匹配开始和立即结束且没有中间内容的行)。
d
: 删除匹配的行。
^ - start of a line
$ - end of line
所以
/^$/
它匹配行开头紧跟行尾的行。这意味着,空行。
sed 命令的d
意思是删除匹配的行,即删除空行。
所以基本上:
sed '/regex/d(elete)' --this is not a real command line, just for explanation.
^$
表示空行,因为^
是一个零宽度锚,表示行的开头,$
是一个零宽度的锚,表示行的结尾。因此^$
必须为零宽度(即根本没有字符)才能匹配。^
行前或行后也不能有任何字符$
。