我想 grep 一行中只有一个“#”的所有行。
例子:
xxx#aaa#iiiii
xxxxxxxxx#aaa
#xxx#bbb#111#yy
xxxxxxxxxxxxxxxx#
xxx#x
#x#v#e#
应该给出这个输出
xxxxxxxxx#aaa
xxxxxxxxxxxxxxxx#
xxx#x
答案1
尝试
grep '^[^#]*#[^#]*$' file
在哪里
^ ; begin of line
[^#]* ; any number of char ≠ #
# ; #
[^#]* ; any number of char ≠ #
$ ; end of line
正如建议的,你可以 grep 整行,
grep -x '[^#]*#[^#]*'
和
- 相同的模式,没有行首/行尾锚点。
-x
要 grep 整行,请参阅man grep
-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
答案2
使用awk
:
awk -F'#' 'NF==2' infile
基于#
字段分隔符,如果一行中的字段数恰好是两个字段,则将打印出来。请注意,例如#x
或x#
甚至#
因此被视为两个字段。
答案3
通过两次调用grep
: 选择至少具有 1 的任何行#
,然后删除至少具有 2 的行:
grep '#' filename | grep -v '#.*#'
答案4
我们awk
可以使用条件块中的 gsub 函数来选择我们的行:
$ awk 'gsub(/#/, "#") == 1' file
$ awk '/#/ && ! /#.*#/' file
$ sed -ne 's/#/&/2;t' -e '//p' file
- 由于sed 的命令和选项,至少 2 行将
#
不会被打印。t
-n
- 这使得我们的行要么恰好有一个#,要么没有。用 // 打印前者
我们可以计算标量上下文中的字符perl
数来检测我们的行:#
$ perl -ne 'print if tr/#/#/ == 1' file