Получите все возможные комбинации слова в более низких / прописных буквах

попробуйте это:

cat config_IP.txt|egrep -v '^#|^$'|awk '{if($1==$2){print "Duplicate IP - "$1}}'
14
17.11.2014, 01:10
4 ответа

POSIX и дефис: Нет гарантии

Согласно стандарту POSIX, имя функции Должно быть действительным именем и имя может состоять из:

3.231 имя
в языке командной связи, слово, состоящее исключительно из исключительно из подчеркивает, цифры и алфавиты из портативного набора символов. Первый символ имени не является цифрой.

Кроме того, псевдоним должен быть действительным именем псевдонима , который может состоять из:

3,10 псевдонима имени
на языке командной связи, слово, состоящее исключительно исключительно подчеркивания, цифры и алфавиты из портативного набора символов и любой из Следующие символы: «!», «%», «, ',' @ '.

Реализации могут позволять другим символам имена псевдонима как расширение. (упор мой.)

Неисправность , перечисленных среди символов, которые должны быть разрешены в любом случае. Итак, если они используются, портативность не гарантируется.

Примеры снарядов, которые не поддерживают дефис

, является оболочкой по умолчанию ( / bin / sh ) в семье Debian-Ubuntu, и она не поддерживает дефисы в именах функций:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

Достаточно интересно поддержка дефисов в псевдонимах, хотя, как отмечалось выше, это характеристика реализации , а не требование:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

Shellbox Shell (Shellquist ) также не поддерживает дефисы в именах функций:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Сводка поддержки дефисов Shell

Следующие оболочки, как известно, поддерживают дефисы в именах функций:

  • KSH, Bash, ZSH

Следующие оболочки известны Не Для поддержки дефисов в именах функций:

  • ASH (Batebox), CSH, TCSH, Dash

Выводы

  • дефисы нестандартные. Держитесь подальше от них, если вы хотите совместимость с перекрестной оболочкой.
  • Используйте подчеркивание вместо дефисов: подчеркивание принимаются повсюду.
-121--18095-

Слегка лучшее решение:

echo {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y}

Для полной масштабируемости:

echo harley \
| perl -nle 'print "echo ",
                    join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c "{}"

Если вы абсолютно должны иметь одно слово на строку, пойти с

for w in {h,H}{a,A}{r,R}{l,L}{e,E}{y,Y};do echo $w;done

благодаря комментарий Mattdm

Соответствующая масштабируемая версия будет:

echo harley \
| perl -nle 'print join "",map { "{" . lc . "," .uc ."}" } split //' \
| xargs -I {} bash -c 'for w in {};do echo $w;done'

для удовольствия, попробуйте заменить «Harley» с «SupercalifragilisticexPialidoCive» Прошло 5 минут, и мой компьютер все еще хрустит это и, вероятно, никогда не закончится: )

18
27.01.2020, 19:50

Править 2: Этот ответ неверно. Это не производит 2 ^ n комбинаций, как оно должно.

Редактировать: Я не знаю почему, но это решение - это , реально по сравнению с решением Perl от @Joeseph r. он работает «суперкалифрагилистическимиспиалидоциалидоциально» менее чем за 0,3 секунды!

Вот моя трещина на этом:

#!/bin/bash

str=${1^^}  # convert to uppercase
len=${#str} # get length of string

for ((perm=0; perm <= len; perm++)); do
    for ((i=0; i <= len; i++)); do
        lower=${str,,}   # convert to lowercase

        # Uppercase n-th letter for permutation
        if [ $perm -gt 0 ]; then
            nth=${lower:perm-1}
            lower=$(echo ${lower:0:perm-1}${nth^})
        fi

        echo -n ${str:0:i} # print orig string from 0 to $i
        echo ${lower:i}    # print new string from $i to end
    done
done | sort -u

работает:

$ ./permutations.sh hi
hi
hI
Hi
HI

$ ./permutations.sh harley
harley
harleY
harlEy
harLey
haRley
hArley
Harley
HarleY
HarlEy
HarLey
HaRley
HArley
HArleY
HArlEy
HArLey
HARley
HARleY
HARlEy
HARLey
HARLeY
HARLEy
HARLEY

Не стесняйтесь вилкой и изменить его, я уверен, что он может быть оптимизирован. https://gist.github.com/ryanmjacobs/4C02Ad80F833Dee0C307

5
27.01.2020, 19:50
eval echo $(echo "word" | sed 's/./{\U&,\L&}/g')
  • sed 's/./{&,&}/g' превратил бы Foo в {F,F}{o,o}{o,o}, что было бы довольно бесполезно.  Но добавьте \U и \L и получите верхний и нижний регистр каждой буквы; i.e., {F,f}{O,o}{O,o}.
  • Тогда это простой вопрос использования eval, чтобы сказать оболочке. для расширения последовательностей {X,x} скоб.
10
27.01.2020, 19:50

Если вы предпочитаете использовать готовые инструменты вместо кодирования, вы можете использовать TextMechanic (генератор перестановок/комбинаций )и Unit -Conversion.info

0
27.01.2020, 19:50

Теги

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