Проверка соответствия строк в файле регулярному выражению, а затем вывод первой строки в этой строке, если она не соответствует

Сначала сделайте резервную копию ваших файлов! Тогда в основном вы можете использовать вкладыш python one -в текущем каталоге с общей формой:

python -c "import glob,os; [os.rename(fn, fn.replace('PATTERN', 'REPLACE')) for fn in glob.glob('PATH/*')]"

в вашем конкретном случае вы можете использовать это дважды:

python -c "import glob,os; [os.rename(fn, fn.replace('.pdf', '')) for fn in glob.glob('*')]"

удалить .pdfи снова:

python -c "import glob,os; [os.rename(fn, fn.replace('PMC', '')) for fn in glob.glob('*')]"

, чтобы удалить PMC.

-1
26.07.2020, 21:44
1 ответ

Вы, должно быть, думали об операторе регулярного выражения \dв perlдля сопоставления десятичных цифр. Но обратите внимание, что немногие grepреализации поддерживают его. Стандартный эквивалент: [[:digit:]].

Некоторые grepреализации поддерживают \d, если передана -Pопция (для использования Perl -как регулярные выражения вместо базовых регулярных выражений ).

Так и с теми,ты мог бы сделать:

grep -Pv '\d\d:\d\d:\d\d' < file.txt

Для возврата строк, не содержащих строку, соответствующую этому шаблону.

(обратите внимание, что это обратная косая черта , а не прямая косая черта)

или:

grep -Pv '(\s+\d\d:\d\d:\d\d){5}\s*$' < file.txt

для строк, которые не заканчиваются 5 такими метками времени.

Чтобы вернуть первое поле в этом случае, вы могли бы вместо этого сделать (с реализациями grep, которые также поддерживают-o)

grep -Po '^(?!.*(\s+\d\d:\d\d:\d\d){5}\s*$)\s*\K\S+' < file.txt

На этот раз с использованием отрицательного -просмотра -оператора perl regexp вместо использования grep's -v.

grepв macOS (, которую вы используете, теперь я удалил тег из вашего вопроса и заменил его на ). быть одним из тех немногих, чьи базовые регулярные выражения поддерживают \d, но не поддерживают -P, поэтому операторы (?!...)и \Kтам недоступны.

Стандартным (и более разборчивым )эквивалентом будет:

awk '!/([[:digit:]]{2}:){2}[[:digit:]]{2}/ {print $1}' < file.txt

awkиспользует расширенные регулярные выражения , что является еще одним диалектом. Остерегайтесь, что некоторые реализации, в том числе mawk, по-прежнему не поддерживают ни оператор интервала {2}, ни классы символов.

В mawkвы бы сделали:

awk '!/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/ {print $1}' < file.txt

Это также должно работать с другими awkреализациями, но имейте в виду, что для некоторых [0-9]могут совпадать символы, отличные от 0123456789 (не -ASCII-символы, поэтому, вероятно, это не будет проблемой при вводе ).

Или еще раз, чтобы все 5 последних полей соответствовали шаблону:

awk '
  {
    for (i = 0; i < 5; i++)
      if (!($(NF-i) ~ /^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/)) {
        print $1
        next
      }
  }' < file.txt
5
18.03.2021, 23:17

Теги

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