В чистом POSIX sed
вы должны вставить все строки самостоятельно. В то время как некоторые люди делают это с помощью N
внутри цикла, самый простой подход — добавить к пространству хранения шаблон H;1h;$!d;x
:
H
добавляет каждую строку в область хранения. К сожалению, добавление первой строки добавит новую строку в начало буфера, поэтому 1h
переопределит пробел для первой строки, чтобы избежать неправильного перехода на новую строку. $!d
завершит обработку всех строк, кроме последней. Их не нужно распечатывать,потому что они хранятся в резервном пространстве x
будет выполнено только после последней строки (для всех остальных строк d
остановит дальнейшую обработку команды )и x
изменит пространство удержания и пространство шаблона, поэтому после этой команды вся файл, который был собран в пространстве хранения, будет находиться в пространстве шаблонов, точно так же, как это было бы с опцией -z
GNU sed
. Конечно, вы также можете использовать g
вместо x
, но это приведет к большому количеству копирования, поэтому x
быстрее. Таким образом, скрипт для примера будет выглядеть так:
sed 'H;1h;$!d;x;s/\(.*\),/\1 and/'
Обратите внимание, что такая обработка файла не рекомендуется для очень больших файлов, так как при этом будет использоваться много оперативной памяти.
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)
(со скобками, а не квадратными скобками ). Но в этом нет необходимости, пока все альтернативы являются одиночными символами.