Видалити до першого виникнення товстої кишки за допомогою sed


16

Моя команда sed:

 sed '/(.*:)/d' <<< 'abcd:bcde:cdeaf'

Він повинен повернутися,

bcde:cdeaf

(тобто) всі символи перед першою двокрапкою у рядку та самій двокрапці повинні бути видалені.

Але це нічого не знімає.

Моя плутанина виникає головним чином через

1) Чи потрібно уникати паронів для узгодження зразків усередині sedge регулярних виразів?

2) У будь-якому випадку (із втечею / без втечі) це не працює. Я намагався,

sed -E '/\\(.*:\\)/d' <<< 'abcd:bcde'
sed 

1
ти хочеш sed 's/[^:]*://'. І ви не dвибираєте рядок введення, до речі, ви модифікуєте його за допомогою s///команди ubstitution. Ви повинні замінити перший не двокрапковий шматочок, а двокрапку, що слідує за ним, взагалі нічого.
mikeserv

що вирішує це ... спасибі, чоловіче ... це приклад, який я взяв, щоб вивчити відповідність шаблонів регулярних виразів усередині sed ... так що я шукаю відповідь, яка використовує груповий / модельний матч з паренами ...

3
Або просто використовуючи bash: printf "%s\n" "${line#*:}"...
jasonwryan

1
@jasonwryan - хороший момент, розглядаючи приклад джерела. це, безумовно, більш ефективний спосіб впоратися з цим. але якщо це таке, while read lineщо отримує $line, мабуть, sedслід віддати перевагу.
mikeserv

Відповіді:


23
$ echo 'abcd:bcde:cdeaf' | sed 's/^[^:]*://g'
bcde:cdeaf

Перший ^означає початок рядка. Це [^:]єдиний спосіб, коли я вмію писати не двокрапку . *Після двокрапки означає будь-яку кількість речей , прямо переді мною (в даному випадку не товстої кишки). Нарешті, :виділяє товсту кишку.

Іншими словами, виберіть початок рядка, будь-яку кількість речей, що не є двокрапкою, і першу двокрапку.

У //gзасобі видалення кожен узгоджений примірника.


3
вам не потрібно ^прив’язувати свою відповідність, за винятком того, що ви також додаєте gлобальний прапор. тут може бути лише одне перше виникнення шаблону, і тому gлобальний прапор не видаляє всі [^:]*:шаблони з рядка, як це було б, якби ви не ^закріпили його. замість того, щоб ускладнювати регулярний вираз з двома непотрібними прапорами, які слугують лише для дебалансування один одного, ви могли просто залишити їх поза цим. Це те, що відредагована версія цієї відповіді продемонструвала, перш ніж повернути її назад. чому б ви наполягали на поширенні поганої інформації, якої я не знаю, але це робить це поганою відповіддю.
mikeserv

@mikeserv, як я вже говорив, дякую, що вказав на це. Я щиро вдячний, що ти допомагаєш мені вдосконалювати свої sedнавички. Я новачок sedі ще не комфортно відхиляюся від дуже обмеженого синтаксису, який я до цього часу підібрав. Це sed(га), я думаю, що моя відповідь вирішує проблему ОП, навіть якщо це не оптимальна (тобто ваша) відповідь. Це Stack Exchange, а не Вікіпедія, тому виправте мене, якщо я помиляюся, але якщо ви знаєте кращу відповідь, слід опублікувати його, щоб люди могли бачити різноманітність підходів і порівнювати їх. Будь ласка, не перетворюйте мою відповідь на вашу відповідь за допомогою функції редагування .
користувач1717828

4
це була не моя відповідь. це була ваша відповідь, відредагована. це все. і це було добре . це вже не.
mikeserv

4

Для роботи зі стовпцями є cut:

echo 'abcd:bcde:cdeaf' | cut -d: -f2-

те ж саме

echo 'abcd:bcde:cdeaf' | cut -d: -f1 --complement

І інша версія з sed(більш швидкою для великих даних):

echo 'abcd:bcde:cdeaf' | sed 's/^://;t;s/:/\n:/;D'

І досить екзотичний в bash

echo 'abcd:bcde:cdeaf' | { IFS=: read -r first last ; echo "$last" ; }

або

echo 'abcd:bcde:cdeaf' | { read -r line ; echo ${line#*:} ; }

або

echo 'abcd:bcde:cdeaf' | { IFS=: read -a a ; printf '%b:' "${a[@]:1}\c" ; echo ;}

Можна також додати правильний спосіб зробити це з СЕД, тобтоsed 's/[^:]*://'
don_crissti

@don_crissti Версія зазначена у відповіді вище. Крім того, завдяки використанню регулярного вираження це відбувається повільніше, оскільки доводиться компілювати вираз у кожному рядку.
Костас

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