Как получить числа указанной длины (диапазона) из строки с помощью grep?

Не повторяйте вывод find . Проблема, с которой вы столкнулись, является типичным следствием этого.

Ваш пример немного сложен из-за переименования файла. Один не очень эффективный, но безопасный способ сделать это - использовать параметр -exec в find и дополнительный sh для каждого файла, например:

find . -type f -iname "*.jpg" -exec sh -c 'echo convert "$1" -resize 800x800\> /home/user/thumbs/"${1%.jpg}_thumb.jpg"' -- {} \;

Если вы не возражаете, используйте то же имя (с суффиксом .jpg вместо _thumb.jpg ), тогда эта простая форма будет работать и будет намного более эффективной:

find . -type f -iname "*.jpg" -exec echo convert "{}" -resize 800x800\> /home/user/thumbs/"{}" \;

Я добавил туда операторы echo для проверки вывода перед выполнением команд. Удалите их, если результат выглядит хорошо.

2
02.05.2016, 23:39
2 ответа

Чтобы знакомые регулярные выражения работали, вам нужно включить «расширенные регулярные выражения» с помощью флага '-E'. При этом ваше регулярное выражение должно работать:

... | grep -E -o '[0-9]{4,16}' 

Флаг -P (Perl-совместимые регулярные выражения), поддерживаемый некоторыми дистрибутивами, в этом случае не нужен.

2
27.01.2020, 22:20

Если развернуть этот однострочник и немного переставить, плюс несколько настроек, получаем:

cat /dev/urandom | \
    tr -dc 'a-zA-Z0-9' | \
    fold -w 16 | \
    tr -d '[A-z]' | \
    grep '....' | \
    head -n 16

Вывод:

7405935
60722
11225
96954
3966
8774
539418
1964
59150
5994
1086
7470
2751
8534
21501
14927

Примечание: n-значные числа вероятно, случайны, если брать их отдельно, но распределение длины цифр , а не . Вот результат 1000000, все цифры заменены на 'x', отсортированы, затем подсчитаны:

 cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | \
    tr -d '[A-z]' | grep '....' | head -n 1000000 | \
    tr '[0-9]' x | sort | uniq -c | nl -v 4

Вывод:

 4   594210 xxxx
 5   275196 xxxxx
 6    96871 xxxxxx
 7    26838 xxxxxxx
 8     5738 xxxxxxxx
 9      997 xxxxxxxxx
10      134 xxxxxxxxxx
11       14 xxxxxxxxxxx
12        2 xxxxxxxxxxxx

Мы видим, что чем больше цифр, тем меньше вероятность получения числа. В миллионных числах только два 12-значных и ни одно из 13-16-значных.

1
27.01.2020, 22:20

Теги

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