И нечувствительность к операциям и регистру в регулярном выражении awk?

Решено:

это была "фича" в lpd. По умолчанию lpd печатает «баннер» и создает 2 файла спула -. Первый файл спула был распечатан, но это только баннер, а второй файл был проигнорирован cups -pdf.

Пришлось отключить баннер в xinetd.conf

server_args = -o document-format=application/octet-stream -o job-sheets=none,none

Это решило мою проблему.

0
04.08.2019, 21:19
2 ответа

напишите свой первый скрипт:

awk 'IGNORECASE = 1;/bingo/ && /number/;'
  1. IGNORECASE не отвечает -только на то, что указано в комментариях, и
  2. ваш код awk эквивалентен:

    awk '(IGNORECASE = 1){print}; (/bingo/ && /number/){print}'
    

поэтому он будет выполнять -нечувствительное к регистру соответствие в GNU awk, но не в других awks, и всегда будет печатать текущую строку (, поскольку присваивание IGNORECASE=1оценивается как 1, что является истинным условием. )и тогда любая строка, содержащая и бинго, и число, будет напечатана во второй раз.

напишите свой второй скрипт:

awk 'tolower($0) ~ /(?=.*bingo)(?=.*number)/'

Этот материал ?=относится к поиску по PCRE -awk поддерживает ERE, а не PCRE, так что мне придется подумать о том, что это на самом деле означает в ERE, но что бы это ни было, это не то, что вы хотели. иметь в виду.

Что касается вашего утверждения, что:

It seems that awk may be performing the match against the lines in each file in the output of ls -R

Не знаю, почему вы так думаете, но нет, это не так.

Вот что, я думаю, вам нужно в GNU awk:

awk 'BEGIN{IGNORECASE=1}; /bingo/ && /number/'

Или:

awk -v IGNORECASE=1 '/bingo/ && /number/'

и в любом awk:

awk '{lc=tolower($0)}; (lc ~ /bingo/) && (lc ~ /number/)'
5
28.01.2020, 02:14

Если вы хотите найти имена в текущем каталоге или ниже, которые содержат строки bingoи number, в любом случае вы не должны передавать вывод ls -Rчерез awk, а вместо этого использоватьfind:

find. -iname '*bingo*' -iname '*number*'

Предикат -inameне является стандартным -, но обычно реализуется и нечувствительно сопоставляет имя просматриваемого в данный момент файла с заданным регистром шаблона подстановки -.

Если вы хотите получить имя файла только , а не полный путь к найденным файлам, используйте

find. -iname '*bingo*' -iname '*number*' -exec basename {} \;

С GNU findвы можете использовать

find. -iname '*bingo*' -iname '*number*' -printf '%f\n'

, что будет быстрее, чем использование basename.

Если вы знаете, что порядок двух слов таков: «bingo, за которым следует number», используйте -iname '*bingo*number*'с findвместо двух -inameтестов.

Если вы знаете, что это именно тот порядок слов, который вы хотите найти, вы также можете использовать bashнапрямую:

shopt -s globstar      # enable ** to match across / in pathnames
shopt -s nocaseglob    # enable case-insensitive globbing
shopt -s failglob      # error when a pattern does not match anything

printf '%s\n' **/*bingo*number*

Чтобы получить часть пути к имени файла:

shopt -s globstar nocaseglob failglob

for name in **/*bingo*number*; do
    basename -- "$name"
done

или, если у вас есть GNU basenameи вы не ожидаете когда-либо сопоставить тысячи файлов,

shopt -s globstar nocaseglob failglob

basename -a -- **/*bingo*number*

где -aуказывает утилите отображать часть имени файла каждого аргумента (несколько аргументов ).

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

!(!(*bingo*)|!(*number*))

Это работает путем сопоставления всех имен, кроме имен, которые не содержат ни одной из двух строк.Таким образом, вы получите

shopt -s globstar nocaseglob failglob
shopt -s extglob  # for extended globbing patterns in bash

for name in **/!(!(*bingo*)|!(*number*)); do
    basename -- "$name"
done

Связанные:

2
28.01.2020, 02:14

Теги

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