Wen*_*iao 2 grep regular-expression
假设有一个包含 7 行的文件。例如:
a
b
c
#
d
e
Run Code Online (Sandbox Code Playgroud)
当我运行时,grep -c '#' -c -v filenamehere
它给了我 6 行。
我希望它显示 5 行来消除那个空白空间。
Kus*_*nda 10
您的文件中有七行,但您想计算非空且不以#
.
$ grep -c '^[^#]' file
5
Run Code Online (Sandbox Code Playgroud)
这会计算在开头包含不是#
字符的字符的行数。
该表达式[^#]
匹配一个不是 的字符#
。完整表达式^[^#]
匹配行首的非#
。
空行不匹配此表达式,以#
¹开头的行也不匹配。
如果您只想计算非空行:
$ grep -c '.' file
6
Run Code Online (Sandbox Code Playgroud)
这计算包含至少一个字符的行。
为了完整起见,计算空行:
$ grep -c -v '.' file
1
Run Code Online (Sandbox Code Playgroud)
要计算空行或以 开头的行#
:
$ grep -c -v '^[^#]' file
2
Run Code Online (Sandbox Code Playgroud)
请注意,-c
和-v
都是“全局”选项。grep
当它们在命令行上给出时,它们会改变整个操作的行为。指定-c
或-v
多次没有意义,并且它们不采用选项参数。
另请注意,如果您在所有选项之后的第一个参数以外的任何地方指定模式或正则表达式,则使用-e 'pattern'
以便grep
知道这是您正在搜索的模式。也就是说,使用任一
grep -e '.' -c -v file
Run Code Online (Sandbox Code Playgroud)
或者
grep -c -e '.' -v file
Run Code Online (Sandbox Code Playgroud)
或者
grep -c -v '.' file
Run Code Online (Sandbox Code Playgroud)
GNUgrep
将以这样一种方式重新排列命令行,即选项出现在路径名操作数之前(除非POSIXLY_CORRECT
在环境中设置),但您通常希望编写适用于任何grep
实现的可移植 shell 代码。
¹ 以非字符开头的行(在用户的语言环境charmap 中碰巧没有形成有效字符的字节序列)也将被排除在大多数grep
实现中。你可以LC_ALL=C grep
用来解决这个问题。作为#
可移植字符集的一部分,这应该是一件有效的事情,因此应该在给定系统上的区域设置之间保持不变。