egrep печатать строки с одним и только одним т - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь напечатать строки, в которых есть только одна буква t или только одна буква T, где все остальное нормально.То есть, нет строк, которые не имеют т, нет строк с 2 или более т, и нет строк, которые имеют 1 T и 1 т.

Я пытаюсь:

egrep '[tT]{1,1}$' filename

и этопоказаны следующие строки:

     nopqrstuvwxyz
     letters    (this line is the one that should not be here)
 The price is *$2*
      one two three (this line should not be here either)
    ONE TWO
 THREE

Это все строки, которые имеют или T в них в файле.Как я должен идти об этом?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Если вы рассматриваете Perl, ниже будет работать

> cat ip.txt
foobaz
nopqrstuvwxyz
letters
The price is *$2*
one two three
ONE TWO
THREE
1234
> perl -ne ' $x++ for(/t/ig);print if $x==1 ; $x=0 ' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
>

Если вам нужно выполнить grep с точными 2 совпадениями - просто измените условие на $ x == 2.

0 голосов
/ 05 декабря 2018
$ cat ip.txt
foobaz
nopqrstuvwxyz
letters
The price is *$2*
one two three
ONE TWO
THREE
1234

$ grep -ix '[^t]*t[^t]*' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
  • -i для игнорирования регистра
  • -x для сопоставления только со всей строкой
    • по умолчанию, grep совпадение в любом месте строки
    • без -x, вам потребуется grep -i '^[^t]*t[^t]*$'
  • [^t]* любой символ, отличный от t (из-за опции -i, T также будетне соответствует)


Вы также можете использовать awk здесь:

$ awk -F'[tT]' 'NF==2' ip.txt
nopqrstuvwxyz
The price is *$2*
ONE TWO
THREE
  • -F'[tT]' указать t или T в качестве разделителя полей
  • NF==2 печатать, если строка содержит два поля, т. Е. Если в строке было одно t или T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...