【发布时间】:2011-03-26 20:13:58
【问题描述】:
我在 Linux 中尝试了grep -v '^$',但没有奏效。此文件来自 Windows 文件系统。
【问题讨论】:
标签: text terminal grep newline
我在 Linux 中尝试了grep -v '^$',但没有奏效。此文件来自 Windows 文件系统。
【问题讨论】:
标签: text terminal grep newline
尝试以下方法:
grep -v -e '^$' foo.txt
-e 选项允许匹配正则表达式模式。
^$ 周围的单引号使其适用于 Cshell。其他 shell 会喜欢使用单引号或双引号。
更新:这对我来说适用于带有空行或“所有空白”的文件(例如带有\r\n 样式行结尾的 windows 行),而上面仅删除带有空行和 unix 样式行结尾的文件:
grep -v -e '^[[:space:]]*$' foo.txt
【讨论】:
grep -E -v,-e 之后的所有内容都被解释为模式。
grep -v -e '^[[:space:]]*$' -e '^#' file 将为您提供脚本或配置文件(或任何使用 cmets 哈希字符的文件类型)中的所有非空白、非注释行。
-e 选项允许匹配正则表达式模式。"这是非常误导。 -e 是(POSIX-)定义:This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).(来自the manual)。默认情况下,Grep 已经需要一个(基本)正则表达式。对于这种模式,您可以完全省略 -e:grep -v '^[[:space:]]*$' foo.txt。
'^[[:cnrl:]]?$'。跨度>
保持简单。
grep . filename.txt
【讨论】:
用途:
$ dos2unix file
$ grep -v "^$" file
或者只是简单的 awk:
awk 'NF' file
如果你没有dos2unix,那么你可以使用tr之类的工具:
tr -d '\r' < "$file" > t ; mv t "$file"
【讨论】:
awk。
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
运行代码-
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
要了解更多关于它是如何/为什么起作用的,我建议阅读正则表达式。 http://www.regular-expressions.info/tutorial.html
【讨论】:
和前面的答案一样:
grep -v -e '^$' foo.txt
这里,grep -e 表示grep 的扩展版本。 '^$' 表示 ^(Start of line) 和 $(end of line) 之间没有任何字符。 '^' 和 '$' 是正则表达式字符。
因此,grep -v 命令将打印所有与此模式不匹配的行(^ 和 $ 之间没有字符)。
这样,空行就被消除了。
【讨论】:
-e 不是“grep 的扩展版”的意思,可能你和-E 混淆了?该手册清楚地表明-e 只是明确表示遵循一种模式。由于该模式不是以破折号开头,而且您只是定义了一个模式,因此您最好将其省略,因为默认情况下 grep 需要一个正则表达式模式:grep -v '^$' foo.txt(不需要扩展正则表达式功能)。另外值得一提的是,这不会消除文件中的空白行,只会消除通过输出管道传输的空白行。对于这种情况,sed -i 将是正确的工具。
如果您在一行中有多个空行序列,并且希望每个序列只有一个空行,请尝试
grep -v "unwantedThing" foo.txt | cat -s
cat -s 抑制重复的空输出行。
您的输出将来自
match1
match2
到
match1
match2
原始输出中的三个空白行将被压缩或“压缩”成一个空白行。
【讨论】:
我更喜欢使用egrep,尽管在我使用带有空行的真实文件的测试中,您的方法运行良好(尽管在我的测试中没有引号)。这也有效:
egrep -v "^(\r?\n)?$" filename.txt
【讨论】:
【讨论】:
此代码删除空行和以“#”开头的行
grep -v "^#" file.txt | grep -v ^[[:space:]]*$
【讨论】:
awk 'NF' file-with-blank-lines > file-with-no-blank-lines
【讨论】:
我很努力,但这似乎有效(假设\r 在这里咬你):
printf "\r" | egrep -xv "[[:space:]]*"
【讨论】:
确实可以使用 grep -v -e '^$',但是它不会删除其中包含 1 个或多个空格的空白行 .我发现删除空行最简单的方法是使用 awk。以下是上面 awk 的一些修改:
awk 'NF' foo.txt
但是由于这个问题是关于使用 grep 的,所以我将回答以下问题:
grep -v '^ *$' foo.txt
注意:^和*之间的空格。
或者你可以使用 \s 来表示这样的空格:
grep -v '^\s*$' foo.txt
【讨论】:
使用 Perl:
perl -ne 'print if /\S/'
\S 表示匹配非空白字符。
【讨论】:
egrep -v "^\s\s+"
egrep 已经做了正则表达式,而 \s 是空格。
+ 复制当前模式。
^ 表示开头
【讨论】:
用途:
grep pattern filename.txt | uniq
【讨论】:
uniq 会将相邻的空行减少到只有一个空行,但不会完全删除它们。尽管如此,我还是喜欢尝试像这样使用uniq。首先排序将有效地删除所有空行 - 只留下一个,但重新排列行顺序可能是不可接受的。
这是另一种去除白线和以# 符号开头的线条的方法。我认为这对于读取配置文件非常有用。
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
【讨论】: