#regex #bash #text-parsing
#регулярное выражение #bash #синтаксический анализ текста
Вопрос:
У меня есть текст, подобный этому ниже:
Insights into Wireless
53m 16s
Insights into Wireless8m 34s
New Terms to Learn11m 19s
Advantages amp; Disadvantages5m 50s
Types of Wi-Fi Networks2m 39s
Wi-Fi Standards7m 24s
Wi-Fi Authentication Modes3m 11s
Chalking4m 38s
Antenna Types7m 22s
Summary2m 17s
Encryption in Wireless
23m 50s
Encryption in Wireless1m 47s
WEP Encryption3m 52s
WPA amp; WPA2 Encryption7m 40s
Breaking Encryption6m 7s
Defending Against Cracking2m 23s
Summary1m 58s
Threats from Wireless
18m 23s
Threats from Wireless1m 38s
Types of Attacks7m 28s
Attack on the AP5m 29s
Attack on the Client2m 43s
Summary1m 3s
The Methodology of Hacking Wireless
45m 20s
The Method of Hacking Wireless1m 8s
Wi-Fi Discovery4m 47s
GPS Mapping13m 51s
Wireless Traffic Analysis6m 9s
Launching Attacks4m 59s
Let's Go Look-ng3m 52s
Cracking Wi-Fi Encryption2m 7s
Let's See How Much Damage We Can Do!6m 59s
Summary1m 24s
Hacking Bluetooth
17m 23s
Hacking Bluetooth1m 0s
The Threats1m 40s
New Terms3m 26s
All About Bluetooth4m 14s
Security5m 43s
Summary1m 18s
Countermeasures
18m 51s
Countermeasures52s
Bluetooth1m 45s
Rogue APs2m 6s
6 Layers of Wireless3m 22s
Best Practices6m 55s
Tools2m 1s
Summary1m 47s
Я хочу убрать длительность с конца каждой строки (если она есть) и сохранить заголовок, как описано ниже —
Insights into Wireless8m 34s
должно быть преобразовано в:
Insights into Wireless
Я использовал этот инструмент онлайн и обнаружил, что он ([0-9]{1,2})ms([0-9]{1,2})s
дает желаемый результат.
Однако использование этого регулярного выражения в моем скрипте bash не дает результатов!
Ниже приведен мой код bash:
name="${string%%'([0-9]{1,2})ms([0-9]{1,2})s'}"
$string содержит каждую строку из приведенного текста примера в самом верху.
Я неправильно использую синтаксис bash для регулярных выражений?
Комментарии:
1.
${var%%pattern}
не использует регулярные выражения. Как вы думаете, почему это происходит?2. Я хочу удалить подстроку, так как же еще я могу использовать шаблон без регулярного выражения?
3. Это глобальный шаблон: gnu.org/software/bash/manual/html_node/Pattern-Matching.html
4. @melpomene чувак, ты потрясающий.. Теперь, я думаю, я могу попытаться разобраться в этом! Bash — это потрясающе!!!!
Ответ №1:
Часть после %%
— это не регулярное выражение, а глобальный шаблон (то, что вы используете для имен файлов, например *.jpg
).
Вы можете сделать это с помощью расширенных шаблонов глобуса в bash. Чтобы включить их, вы должны поместить shopt -s extglob
в начале вашего скрипта. Вот пример:
shopt -s extglob
string='GPS Mapping13m 51s'
name="${string%% ([0-9])m ([0-9])s}"
echo "$name"
Комментарии:
1.
Countermeasures52s
не работает… Я пытался что-то вроде,?( ([0-9])m)?( )( ([0-9])s)
которое исправляетCountermeasures
, но оставляет все остальные такими, какSome Random Text11m
,Some Other Text4m
.. и так далее .. что я упускаю, чувак?2. Это была опечатка..
?(@( ([0-9])m ([0-9])s)| ([0-9])s)
кажется, это работает нормально.