特定の文字のインスタンスを含むすべての行を Grep

特定の文字のインスタンスを含むすべての行を Grep

1行に「#」が1つだけあるすべての行を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

フィールド区切り文字に基づいて#1行のフィールド数が正確に2つのフィールドの場合に印刷されます。たとえば、#xまたはx#さらに#は2つのフィールドとして扱われます。

答え3

2回の呼び出し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
  • これにより、行に正確に1つの#またはなしが残ります。 // を使用して電子を印刷します。

perl行を検出するために、スカラーコンテキストの文字数を計算できます。#

$ perl -ne 'print if tr/#/#/ == 1'  file

関連情報