Як зіставити цифри з наступною крапкою за допомогою sed?


76

Я намагаюся використовувати sedдля заміни всіх шаблонів цифрами, за якими одразу крапкою (наприклад 3., 355.) є порожній рядок. Тому я намагаюся:

sed 's/\d+\.//g' file.txt

Але це не працює. Чому так?


1
Я вважаю цю статтю дуже корисною
Stphane

Відповіді:


111

Оскільки sed не є perl - sed-регулярні вирази не мають \dскорочення:

sed 's/[[:digit:]]\+\.//g'

тут регулярна виразна документація .


3
Це якщо потрібно нуль або більше цифр. /[[:digit:]]*\. /відповідатиме рядку, foo.тому що ви маєте нульові цифри. Якщо ви хочете використовувати одне або більше, \+як показано
glenn jackman

71

Дві проблеми:

  1. sedне підтримує \d. Використовуйте [0-9]або [[:digit:]].

  2. +має отримати керуючі послідовностями особливого значення: \+.


6
замість того, щоб перекинути риску + (яка, наприклад, не працює на Mac OS X), ви можете скористатися параметром -E, щоб interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's).сумно, це не допоможе в \ d випуску ...
gMale

4
@gmale: -Eне працює для GNU sed, він використовує -rнатомість.
choroba

12
Гаразд ... це впевнено виглядає як sedпросто смокче, коли йдеться про портативність ...
iconoclast

@choroba Я думаю, що сьогодні я переплутав себе. Я збираюсь видалити свої шумні коментарі ...
Стівен Лу

В основному, про що я намагався попередити людей, це: якщо ви не використовуєте розширений регулярний вираз ( -Eна BSD sed і -rна GNU sed), в BSD sed ні, +ні \+(те саме ?) не працюватимуть взагалі, тоді як у GNU sed ви можете змусити їх працювати з косою рисою. Звідси загальна рекомендація використовувати розширений регулярний вираз у сценаріях
Стівен Лу,

3

Сторінка sed man посилається на man-сторінку re_format. Він робить 2 розрізнення: (1) застарілий порівняно з розширеними регулярними виразами; (2) некращені проти покращені регулярні вирази. Можливі всі 4 комбінації. Існує підтримка в sed і для застарілих, і для розширених, але в будь-якому випадку лише для непідсилених. Оператор \ d є функцією розширених регулярних виразів, тому не підтримується sed.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.