Удалить до первого появления двоеточия с помощью sed

16

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

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

Должно вернуться,

bcde:cdeaf

(т.е.) все символы перед первым двоеточием в строке и само двоеточие должны быть удалены.

Но это ничего не убирает.

Моя путаница возникает в основном из-за,

1) Нужно ли экранировать паренов для сопоставления с образцом внутри регулярных выражений sed?

2) В любом случае (с выходом / без выхода) он не работает. Я старался,

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

источник
1
ты хочешь sed 's/[^:]*://'. И вы не deleting входной линии, кстати, вы изменяете его с помощью 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средстве удаления каждый согласованный экземпляра.

user1717828
источник
3
вам не нужно ^привязывать ваш матч, за исключением того, что вы также добавляете gфлаг lobal. может быть только одно первое появление шаблона, и поэтому gфлаг lobal не удаляет все [^:]*:шаблоны из линии, как это было бы, если бы вы не ^привязали его. вместо того, чтобы усложнять регулярное выражение двумя ненужными флагами, которые служат только для дисбаланса друг друга, вы можете просто пропустить их, что и было продемонстрировано в отредактированной версии этого ответа, прежде чем вы откатили его обратно. почему вы настаиваете на распространении плохой информации, я не знаю, но это делает это плохим ответом.
mikeserv
@mikeserv, как я уже сказал, спасибо за указание на это. Я искренне ценю, что вы помогаете мне улучшить мои sedнавыки. Я новичок, sedи мне пока неудобно отклоняться от очень ограниченного синтаксиса, который я до сих пор изучал. Это sed(хех), я думаю, мой ответ решает проблему ОП, хотя это не оптимальный (т. Е. Ваш) ответ. Это Stack Exchange, а не Википедия, так что поправьте меня, если я ошибаюсь, но если вы знаете лучший ответ, вы должны опубликовать его, чтобы люди могли увидеть различные подходы и сравнить их. Пожалуйста, не включайте мой ответ в ваш ответ с помощью функции редактирования .
user1717828
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, то естьsed 's/[^:]*://'
don_crissti
@don_crissti Версия отмечена в ответе выше. Кроме того, из-за использования регулярных выражений это медленнее, так как приходится компилировать выражения в каждой строке.
Костас
Нет, это не так. Приведенный выше ответ отнимает много времени и заслуживает большого количества отрицательных голосов, особенно если вы читаете ревизии и комментарии там.
don_crissti