Печатать строки, в которых каждое слово строки с заглавными буквами начинается с другой буквы

apt install есть опция --print-uris, которая делает именно это:

$ apt install --print-uris libreswan
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libcurl3-nss
The following NEW packages will be installed:
  libcurl3-nss libreswan
0 upgraded, 2 newly installed, 0 to remove and 7 not upgraded.
Need to get 1,255 kB of archives.
After this operation, 4,584 kB of additional disk space will be used.
'http://ftp.fr.debian.org/debian/pool/main/c/curl/libcurl3-nss_7.64.0-4_amd64.deb' libcurl3-nss_7.64.0-4_amd64.deb 335908 MD5Sum:376a45e2415e9aea88f5c8825dba0697
'http://ftp.fr.debian.org/debian/pool/main/libr/libreswan/libreswan_3.27-6_amd64.deb' libreswan_3.27-6_amd64.deb 919276 MD5Sum:cc05b89c596bcf40ac16a9e9fd4185b9

В нем перечислены все пакеты, которые будут загружены, с их URI, именем целевого файла, размером файла и хэшем.

Обратите внимание, что файлы, которые уже присутствуют в вашем локальном кэше APT, не будут перечислены.

-3
21.10.2021, 20:56
2 ответа

Вы можете использовать регулярное выражение для сканирования ввода и получить желаемый результат.

Мы указываем grepискать заглавное слово, первый символ которого находится ниже по строке, но только в начале другого заглавного слова. Поскольку это подразумевает по крайней мере одно такое совпадение, но мы не хотим, чтобы таких совпадений не было, мы инвертируем -vсмысл совпадения, чтобы получить желаемый результат.

Отредактировано :на основе наблюдений @they, он изменен для поиска слов в верхнем регистре.

grep -v  '\<\([A-Z]\)[A-Z]\{1,\}\>.*\<\1[A-Z]\{1,\}\>'  file
2
22.10.2021, 03:02

Использование Raku (, ранее известного как Perl _6)

raku -ne '.put if.words.map(*.comb(/ ^<upper> /)).Bag.values.max == 1;'  

Пример ввода:

FOUR MILLION, EIGHT HUNDRED AND FIFTY-SEVEN THOUSAND, FIVE HUNDRED AND THIRTEEN innovating
FORTY-NINE MILLION, ONE HUNDRED AND EIGHTY THOUSAND, TWO HUNDRED AND FORTY-EIGHT championed
FORTY-SEVEN MILLION, NINE HUNDRED AND FIFTY-TWO THOUSAND, EIGHT HUNDRED AND SIX swashbuckling
NINE HUNDRED AND SIXTY-ONE THOUSAND, SIX HUNDRED AND THIRTY-ONE sprinklers
FORTY-TWO MILLION, TWO HUNDRED AND SIXTY-SIX THOUSAND, THREE HUNDRED AND SEVENTY-TWO furloughs
SEVEN MILLION, FOUR HUNDRED AND SEVENTEEN THOUSAND, FOUR HUNDRED AND FORTY-TWO panicky
THREE HUNDRED AND SEVENTY-NINE THOUSAND, FIVE HUNDRED AND TWENTY-EIGHT anchovies
FIVE MILLION, EIGHT HUNDRED AND FIFTY-NINE THOUSAND, FOUR HUNDRED AND SIXTY-FOUR excesses
FIFTY THOUSAND, NINE HUNDRED AND EIGHTEEN
FOURTEEN THOUSAND, SEVEN HUNDRED AND NINETY-EIGH

Пример вывода:

FIFTY THOUSAND, NINE HUNDRED AND EIGHTEEN
FOURTEEN THOUSAND, SEVEN HUNDRED AND NINETY-EIGH

Эта проблема легко решается с помощью одного -лайнера в Raku — новом названии языка программирования, ранее известного как Perl6 (, переименованного в 2019 году ).

Вкратце, ввод считывается в Raku построчно с использованием флагов командной строки -ne. Ввод разбивается на пробелы -, разделенные words, каждое из этих слов проверяется (с использованиемmap)и фильтруется (с использованиемcomb)для слов, начинающихся с заглавной буквы (с использованием регулярного выражения ^<upper>). Эти буквы затемBag-оцениваются, при этом подсчитывается количество вхождений, и возвращаются только строки, в которых существует max == 1вхождений (, т. е. нет повторяющихся букв ).

Кажется, есть некоторый комментарий к тому, что составляет «слово» для этой проблемы. Если вы хотите считать слова через дефис как отдельные слова, сначала разделите их по дефисам, добавив .split("-")в начало цепочки методов (перед.words).

Чтобы дать вам представление о том, как работает приведенный выше код Raku, вот основная часть кода с подпрограммой split, но без условного выражения if, и без maxусловного:

raku -ne '.split("-").words.map(*.comb(/ ^<upper> /)).Bag.put;' 

H(2) M A(2) T(2) E S F(3)
T(2) N E(2) H(2) O F(2) M A(2)
M S(2) T(2) N A(2) E H(2) F(2)
O(2) H(2) S(2) A(2) T(2) N
M H(2) A(2) S(3) F T(5)
S(2) F(3) A(2) H(2) T(2) M
T(3) H(2) S E F N A(2)
H(2) T S M N A(2) F(4) E
A E F H N T
E T F N H S A

https://docs.raku.org/language/regexes#Predefined_character_classes
https://raku.org

1
22.10.2021, 02:42

Теги

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