Как grep может вернуть другое количество совпадений?

В чистом POSIX sedвы должны вставить все строки самостоятельно. В то время как некоторые люди делают это с помощью Nвнутри цикла, самый простой подход — добавить к пространству хранения шаблон H;1h;$!d;x:

  • Hдобавляет каждую строку в область хранения. К сожалению, добавление первой строки добавит новую строку в начало буфера, поэтому
  • 1hпереопределит пробел для первой строки, чтобы избежать неправильного перехода на новую строку.
  • $!dзавершит обработку всех строк, кроме последней. Их не нужно распечатывать,потому что они хранятся в резервном пространстве
  • xбудет выполнено только после последней строки (для всех остальных строк dостановит дальнейшую обработку команды )и xизменит пространство удержания и пространство шаблона, поэтому после этой команды вся файл, который был собран в пространстве хранения, будет находиться в пространстве шаблонов, точно так же, как это было бы с опцией -zGNU sed. Конечно, вы также можете использовать gвместо x, но это приведет к большому количеству копирования, поэтому xбыстрее.

Таким образом, скрипт для примера будет выглядеть так:

sed 'H;1h;$!d;x;s/\(.*\),/\1 and/'

Обратите внимание, что такая обработка файла не рекомендуется для очень больших файлов, так как при этом будет использоваться много оперативной памяти.

2
02.09.2021, 09:44
1 ответ

grep ищет только те строки, которые соответствуют хотя бы одному из заданных шаблонов. Имея 24 шаблона в aList, вполне возможно, что один из первой половины и один из второй половины совпадают. Это означало бы, что вы получите совпадения в одной строке как для grep -f firstHalf, так и для grep -f secondHalf. Запуск двух половин списка шаблонов по отдельности привел бы к двойному учету этих строк.

.

$ cat test.txt 
abc 
foo
bar
foobar
$ cat patterns 
foo
bar
$ grep -c -f patterns  test.txt 
3

но, конечно, и:

$ grep -c -e foo test.txt
2
$ grep -c -e bar test.txt
2

И 2+2 > 3.

Если все строки различны, подсчет уникальных совпадающих строк, конечно, поможет устранить этот эффект. Вы можете использовать grep -nдля добавления номеров строк к выводу, делая каждую строку вывода уникальной. Конечно, помните, что по умолчанию grepищет совпадения в любом месте строки, и если это не то, что вам нужно, вам нужно использовать grep -x.

Также обратите внимание, что [A|C|T]означает соответствие любому из символов A, C, Tили |. Если вы не хотите или вам не нужно сопоставлять символ вертикальной черты, используйте просто [ACT]. Или, если вам нужно чередование, вы должны использовать расширенные регулярные выражения (grep -E), а затем(this|that)(со скобками, а не квадратными скобками ). Но в этом нет необходимости, пока все альтернативы являются одиночными символами.

13
02.09.2021, 09:54

Теги

Похожие вопросы