Горный словарь для строк поиска sed - PullRequest
0 голосов
/ 12 июня 2018

Ради интереса я искал словарь для слов, которые sed мог бы использовать для изменения строк.Пример:

sed settee    <<< better
sed statement <<< dated

Выходы:

пиво
сумасшедший

Эти sed s слова должны быть не менее 5 букв длиной и начинаются с s, затем еще одна буква, которая может появляться только 3 раз, по крайней мере с одной другой буквоймежду первым и вторым экземплярами и с третьим экземпляром в качестве последней буквы.

Я использовал sed для генерации списка слов, и, похоже, он работает:

d=/usr/share/dict/american-english
sed -n '/^s\([a-z]\)\(.*\1\)\{2\}$/{
            /^s\([a-z]\)\(.*\1\)\{3\}$/!{/^s\([a-z]\)\1/!p}}' $d | 
xargs echo

Вывод:

санатории санатории саркомата саванна отдел секретный секретный сегрегация выборочное предложение предложение setimentize septette последовательность серенада безмятежный серпантин пригодный для обслуживания ведомая дивизия разъединение тяжелая канализация секстетт самое лучшее утверждение самый незаметный самый строгий из самых строгих стрижек * самый строгий из самых строгих стрейджетов

Но этот код sed проходит три прохода через каждую строку, что кажется чрезмерно длинным изапутано.Как можно упростить этот код, при этом выводя тот же список слов?

grep или awk ответы также будут в порядке.

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

awk на помощь!

код чище с awk и читается как спецификация: разделить слово на основе второго символа, три экземпляра символа разделят слово на 4 сегмента;2-й должен иметь по крайней мере один символ, а последний должен быть пустым.

$  awk '/^s/{n=split($1,a,substr($1,2,1)); 
             if(n==4 && length(a[2])>0 && a[4]=="") print}' /usr/share/dict/american-english | xargs

sanatoria sanitaria sarcomata саванна secede секретная секретная отдельная выборочная выборка предложений sentience сентиментализирующая последовательность септет серенада безмятежная серпантинная обслуживаемая серветтатяжелая канализация секстетт самое современное утверждение скрытная самая прочная прямая рубашка смирительная рубашка стратег уличный фонарь самая эластичная строжайшая структуралистка

0 голосов
/ 05 ноября 2018

Быстрый pcregrep метод, ( .025 секунд пользовательское время):

d=/usr/share/dict/american-english
pcregrep '^s(.)((?!\1).)+\1((?!\1).)*\1$' $d | xargs echo

Выход:

sanatoria sanitaria sarcomata savanna secede sequetсекретный отдельный выборочный предложение предложение сентиментализировать септетную последовательность серенада безмятежный серпантин, пригодный для использования в салфетке с оберткойРегулярное выражение: сопоставить все, кроме обратной ссылки

0 голосов
/ 12 июня 2018

очень классная идея.Я думаю, что вы более строгие, чем необходимо

sed -nE '/^s(.)[^\1]+\1[^\1]*\1g?$/p'

, кажется, работает нормально.Это произвело 518 слов для меня.У меня есть только /usr/share/dict/words файл словаря.

сабадилла сабаха сабана саббатия сабдарифа сакатра-сахарилла-сахарогалакторея сахаросорея сахаросурия-сахария-сакральгия сакрария сакракийя * сакрокринта сакра-сальта сагура сальгоритм
подразделение каскадеров sucuriu sucuruju sulphurou surucucu сиенит-порфировая симфизеотомия symphysiotomy symphysotomy symphysy symphysly синдактилия синонимы синонимы синонимы syzygetically syzygy

интересная находка - 1013

$ sed snow-nodding <<< now-or-never
noddior-never
1013 *
...