Обнаружьте повторение шаблона в файле

“Никакой такой файл или каталог” сообщение на самом деле не относится к загрузчику для 32-разрядных исполняемых файлов, который необходим для выполнения 32-разрядного исполняемого файла. Для более подробного объяснения см. " не показанное" сообщение при выполнении 32-разрядного двоичного файла в 64-разрядной системе. Необходимо установить 32-разрядную поддержку на Дуге Linux.

К сожалению, Дуга Linux не имеет простого способа установить 32-разрядную поддержку. В данный момент необходимо включить [мультиlib] репозиторий путем добавления этих строк к pacman.conf:

[multilib]
Include = /etc/pacman.d/mirrorlist

Посмотрите Arch64 FAQ и Используя 32 разрядных приложения на Arch64 на Wiki для получения дополнительной информации.

2
07.05.2012, 13:22
2 ответа

Это произведет номера строки недопустимых строк:

sed -n '/\([a-z]\+\).*\1_KO/b;/\([a-z]\+\)_KO.*\1/b;=' input_file

Но не соглашения с несколькими “_KO” на одной строке.


Это должно быть более надежным и портативным:

awk '{for(i=1;i<=NF;i++)if((s=$i)~/^([a-z]+)_KO/){sub(/_KO$/,"",s);o=0;for(j=1;j<=NF;j++)if($j==s)o=1;if(!o)printf"line %d unmatched %s\n",NR,s}}' input_file

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

ruby -nae '$F.sort!.select!{|v|v=~/^[a-z]+(_KO)?$/};$F.each_with_index{|v,k|puts"line #{$.} unmatched #{v}"if v[/^([a-z]+)_KO$/]and$F[k-1]!=$1}' input_file

В основном то же как вышеупомянутое awk решение, но взгляды, менее подробные в perl:

perl -nae 'for$k(grep/^[a-z]+_KO$/,@F){print"line $. unmatched $k\n"unless grep{$_ eq substr$k,0,-3}@F}' input_file
4
27.01.2020, 21:53
  • 1
    Это, кажется, не работает с Солярисом sed. Вот ошибка, которую я получаю: sed: Label too long: /\([a-z]\+\).*\1_KO/b;/\([a-z]\+\)_KO.*\1/b;=. Я попытаюсь достать GNU sed, но это не легко сделать здесь... –  rahmu 07.05.2012, 13:38
  • 2
    awk сценарий работал отлично спасибо. Не берите это неправильный путь, но я не нахожу это очень изящным к "в лоб" как это вручную по каждому полю. Я уверен, что Вы соглашаетесь. Должен быть более изящный способ обнаружить, если подобранный шаблон повторяется несколько раз на строке. –  rahmu 07.05.2012, 15:28
  • 3
    , который я согласовываю, это выглядит довольно неуклюжим. Но с несколькими шаблонами и различным порядком я не вижу более простого пути на данный момент. –  manatwork 07.05.2012, 15:36
  • 4
    @manatwork Вы являетесь просто удивительными с awk/sed :-) –  Nikhil Mulley 07.05.2012, 15:47

Некоторый загадочный жемчуг:

perl -ne '/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/ && print "invalid line $.: missing $1\n"' filename

/(\w+)_KO\b/ найдите "_KO" слово и получите часть non-KO в переменную $1
!/\b$1(?!_KO)\b/ верно, если нет НИКАКОГО "автономного" слова без _KO (\b граница слова),
Если оба тех условия верны, печатают сообщение об ошибке.

Определить, "допустим" ли файл, также

output=$(perl -ne '/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/ && print "invalid line $.: missing $!\n"' filename)
[ -z "$output" ] && echo valid

или

perl -ne '
    BEGIN {$count = 0}
    if (/(\w+)_KO\b/ && !/\b$1(?!_KO)\b/) {print "invalid line $.: missing $!\n"; $count++}
    END {$count == 0 && print "valid\n"}
' filename
3
27.01.2020, 21:53
  • 1
    Работавший вполне прилично. Я действительно получал некоторые ложные положительные стороны хотя для слов, содержащих _KO в них. Я добавил a \b к Вашему сопоставлению с образцом regex, согласно Вашим объяснениям. Я не знаю синтаксис жемчуга, поэтому если я ошибаюсь, не смущаются повторно изменять. –  rahmu 07.05.2012, 18:07

Теги

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