5

我试图使用 bash 脚本删除文件中的空白行。现在,当我在 INTERNET 中搜索时,我遇到了它的两种变体。一方面,我们可以直接修改源文件,另一方面我们可以将输出存储在另一个文件中。以下是代码片段:

sed -i '/^$/d' fileName.txt

sed '/^$/d' fileName.txt > newFileName.txt

我无法理解的是如何将正则表达式 '/^$/d' 解释为空行。恐怕我不擅长正则表达式。有人可以解释一下吗?

还有其他方法吗?

4

6 回答 6

10
/^$/d


/ - start of regex
^ - start of line
$ - end of line
/ - end of regex
d - delete lines which match

所以基本上找到任何空的行(起点和终点是相同的,例如没有字符),然后删除它们。

于 2013-04-03T19:23:36.230 回答
3

让我们从正则表达式的解释开始:

/^$/d

^匹配行首和$行尾。所以^$将匹配空行。

您还将d标志与sed. 这将删除匹配的行。

-i切换sed -i '/^$/d' fileName.txt使sed就地删除线。如果你忽略它,它会将结果输出到标准输出。

于 2013-04-03T19:25:06.610 回答
1

/^$/d是一个sed删除空行的命令。它实际上是两个东西粘在一起:一个正则表达式/^$/和一个sed指令d

/^$/组件是一个匹配空字符串的正则表达式。更具体地说,它查找行首 ( ^) 紧跟行尾 ( $),即空行。如果行中有任何内容(空格或其他内容),则该模式将不匹配,因为行尾不会直接跟随行首。

d组件是一个sed表示“删除”的指令。在此用法中,d适用于与给定正则表达式 ( /^$/) 匹配的任何行,因此它将删除任何空行。

因为sed在自动打印模式下运行(没有-n开关),它将打印所有未删除的行——因此,在这种情况下不匹配/$^/——因此该命令最终成为一个过滤器,从输入。

于 2013-04-03T19:22:02.463 回答
1

/^$/: 选择空行(^匹配行首,$匹配行尾,因此这匹配开始和立即结束且没有中间内容的行)。
d: 删除匹配的行。

于 2013-04-03T19:23:47.760 回答
0
^ - start of a line
$ - end of line

所以

/^$/ 

它匹配行开头紧跟行尾的行。这意味着,空行。

sed 命令的d意思是删除匹配的行,即删除空行。

所以基本上:

sed '/regex/d(elete)'  --this is not a real command line, just for explanation.
于 2013-04-03T19:23:23.420 回答
0

^$表示空行,因为^是一个零宽度锚,表示行的开头$是一个零宽度的锚,表示行的结尾。因此^$必须为零宽度(即根本没有字符)才能匹配。^行前或行后也不能有任何字符$

于 2013-04-03T19:23:49.360 回答