특정 문자의 인스턴스를 포함하는 모든 줄을 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

필드 구분자를 기준으로 #한 줄의 필드 수가 정확히 2개 필드인 경우 인쇄됩니다. 예를 들어 #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

관련 정보