我试图使用 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.
^$表示空行,因为^是一个零宽度锚,表示行的开头,$是一个零宽度的锚,表示行的结尾。因此^$必须为零宽度(即根本没有字符)才能匹配。^行前或行后也不能有任何字符$。