Можно ли установить дистрибутив Linux на беспроводной ключ?

Таблицы поиска могут быть трудными - и дорогими - потому что вам придется искать на обоих концах пространства шаблонов одновременно. Хотя, по крайней мере, это можно реализовать более или менее просто. Вы должны учитывать, что независимо от того, что вы делаете, вы можете надежно обрабатывать только одно совпадение за раз, и поэтому вы можете отказаться от всякой надежды на общий результат g . В любом случае это только запутает - вы не работаете с скомпилированным выражением, вы буквально работаете с побочными эффектами и обеими сторонами для загрузки.

printf  %s\\n some words to match \
        'and some words and some more words to match them against' |
sed  -ne'$!{H;d;}' -e'G;s/\(\n\).*/\1&\1/;tm' -e:m \
     -e 's/\(.\)\(.*\)\(.*\n\n.*\n\1\2\(\n\)\)/`\1\4\2`\3/;tm'

Это основной цикл. На самом деле он еще не работает, потому что я еще не убираю его там, но он решает основную проблему.Поскольку вам нужно многократно перебирать одно и то же пространство шаблонов, как вы можете быть уверены, что совпадение не совпадает дважды, верно? Если вы закроете его с каким-либо разделителем, вы все равно снова сопоставите, и вы просто будете складывать подставки для книг до бесконечности.

Решение, которое я использую здесь, - испортить спичку. Я вставляю новую строку после первого символа совпадения, которую мне, конечно же, еще нужно очистить, и с которой я сейчас справлюсь. Однако это по-прежнему не работает, если ваши таблицы поиска могут содержать элементы, которые являются подмножествами других элементов, или если вы работаете с одиночными наборами символов. Есть способы сделать это - и способы сделать это лучше - и я предложу вам несколько альтернатив, если вы их попросите.

Вот еще кое-что:

printf  %s\\n some words to match \
        'and some words and some more words to match them against' |
sed  -ne'$!{H;d;}' -e'G;s/\(\n\).*/\1&\1/;tm' -e:m \
     -e 's/\(.\)\(.*\)\(.*\n\n.*\n\1\2\(\n\)\)/`\1\4\2`\3/;tm' \
     -e  l

and `s\nome` `w\nords` and `s\nome` more `w\nords` `t\no` `m\natch` \
them against\n\n\nsome\nwords\nto\nmatch\n$

И очистка, конечно, проста:

printf  %s\\n some words to match \
        'and some words and some more words to match them against' |
sed  -ne'$!{H;d;}' -e'G;s/\(\n\).*/\1&\1/;tm' -e:m \
     -e 's/\(.\)\(.*\)\(.*\n\n.*\n\1\2\(\n\)\)/`\1\4\2`\3/;tm' \
     -e 's/\(`.\)\n/\1/g;P'

and `some` `words` and `some` more `words` `to` `match` them against

По крайней мере, вы можете сделать g локально.


Я предпочитаю делать подобные вещи, создавая для этого сценарий.

printf  %s\\n some words to match \
        'and some words and some more words to match them against' |
{   sed -e"$(
        sed -ne'$w /dev/fd/3' -e$\q     \
             -e 's/[]\^$/.*[]/\\&/g'    \
             -e 's|..*|s/&/`\&`/g|p'
    )"  <&3
}   3<<""    3<>/dev/fd/3

and `some` `words` and `some` more `words` `to` `match` them against

sed в подстановке команд записывает оператор подстановки sed s /// ubstitution после того, как позаботится об экранировании любых метасимволов в любой строке ввода, кроме последней, которая может содержать. Последняя строка w буквально обращается к совместно используемому файловому дескриптору here-doc для внешнего sed для чтения в качестве входных данных. Внутренний sed печатает сценарий, который работает как:

sed -e's/some/`&`/g'  \
    -e's/words/`&`/g' \
    -e's/to/`&`/g'    \
    -e's/match/`&`/g'

... и передает последнюю строку другому sed для последующей обработки.

-3
13.12.2017, 14:07
0 ответов

Теги

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