Sed видаліть усі рядки початку малюнка з рядка


11

У мене є такий рядок:

abababtestab

Я намагаюся розібратися з sedвиразом, щоб видалити всі події abз початку рядка, так що перетворена лінія повинна бути:

testab

Я відчуваю, що це має бути простим, але я насправді нічого не знаю sed.

Я маю поки що:

sed 's/^ab//'

Але це видаляє лише перше виникнення ab.

Відповіді:


16
sed 's/^\(ab\)*//' <in >out

Ви повинні згрупувати це.

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

Однак деякі старші sedлюди можуть не дуже добре впоратися. Хоча дублювання субвиразів є функцією BRE, визначеною POSIX , деякі sedз них не підтримують належним чином. У деяких з них, хоча ...

echo abababtestab |
sed 's/^\(ab\)\1*//'

... може замість цього працювати.


Саме те, що я шукав подяку! (Я буду відзначати як відповідь , як тільки це дозволяє мені)
Дену

Навіть 7-е видання sedз 1979 року підтримувало його. Це мало б бути неповноцінною імітацією, щоб не обробляти групування.
Джонатан Леффлер

@JonathanLeffler - див. Обґрунтування регулярних виразів POSIX , що частково є тим, на чому я ґрунтував твердження. Можливо, це припущення, але там є абзац ... Розробники стандартів розглядали загальну історичну поведінку, яка підтримувала \n*, але ні \n\{min,max\}. \(...\)*або \(...\)\{min,max\}, як ненавмисний результат конкретної реалізації, і вони підтримували як дублювання, так і інтервальні вирази після субекспресій та зворотних посилань.
mikeserv

@JonathanLeffler: Він також не працює з версією sed від інструментальних інструментів heirloom.
cuonglm

@cuonglm - \(ab\)\1*версія працює з реліквією за замовчуванням sed, а \(ab\)*версія працює з реліквією SuSv4 sed. Принаймні, це робить для моєї побудови. Щоправда, я створив свій реліквій набір проти musl lib C, і тому я можу собі уявити, що це може спричинити його поведінку по-іншому. Але зазвичай, коли зазначена функція працює в інструменті реліквія SuSv4 heirloom, але не в інструменті за замовчуванням, це відбувається тому, що розробник зробив це.
mikeserv

6

Ще sed:

sed -e ':1' -e 's/^ab//;t1'

З кожним рядком введення ми встановлюємо мітку :1, потім робимо sвступ abна початку рядка. Якщо sвведення встановлено успішно, test командної гілки для позначення 1, повторіть роботу, поки abна початку рядка не з’явився зразок, ми закінчили.


Мої думки точно. Суворо, вам не потрібно тестувати: s/^ab//; t1достатньо
glenn jackman

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