Grep 所有包含特定字符的一个实例的行

Grep 所有包含特定字符的一个实例的行

我想 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

基于#字段分隔符,如果一行中的字段数恰好是两个字段,则将打印出来。请注意,例如#xx#甚至#因此被视为两个字段。

答案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

相关内容