Как использовать Sed для замены всех символов перед двоеточием?


25

Как заменить следующую строку

hd_ma_prod_customer_ro:*:123456789:john.doe

с john.doe

В основном мне нужно искать последний двоеточие (:) и удалять все до и включая его.

Ответы:


40

Предполагая, что вы на самом деле имеете в виду, вы хотите удалить все до последнего двоеточия и оставить john.doeбез изменений:

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
  sed 's/.*://'

Объяснение:

Первая строка просто передает тестовую строку sedдля примера.

Второе - это базовая sedзамена . Часть между первым и вторым /- это регулярное выражение для поиска, а часть между вторым и третьим - это то, чем его заменить (в данном случае мы ничего не удаляем).

Для регулярного выражения .соответствует любому символу, *повторяется это любое количество раз (включая ноль) и :соответствует двоеточию. Так эффективно это что-нибудь, сопровождаемое двоеточием. Так как .*может содержать двоеточие, совпадение будет «жадным», и будет включено все до последнего двоеточия.


7
sed -r 's/:/\t/g' filename | awk -F'\t' '{print $4}'

Я заменяю все вхождения : на вкладку, а затем использую awkдля извлечения строки john.doe.

Если у вас нет файла, вы можете попробовать это.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | 
awk -F'\t' '{print $4}'

Согласно комментариям Грэма, мы можем использовать awkдля печати только последний столбец, используя NFпеременную, awkкак показано ниже.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'

Включая комментарии Грэма, чтобы избавиться от ненужного sed

Команду можно изменить, как показано ниже.

echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'

1
Если вы собираетесь использовать awk, почему бы просто не сделать awk -F:?
Грэм

@ Грэм, мне все еще не очень удобно awk. По сути, я пытаюсь проверить команды, которые я получил в ответе, и изменить их в соответствии с требованиями пользователя. :)
Рамеш

3
-FВариант для awkЗадает разделитель полей. Если вы скажете awkиспользовать двоеточие, нет необходимости заменять двоеточия на вкладки. Кроме того, если вы хотите получить последнее поле, которое вы можете использовать $NFвместо этого $4, это будет работать, если не всегда 3 двоеточия.
Грэм,

@ Grame, я включил изменения, которые вы упомянули. Пожалуйста, дайте мне знать, если это хорошо :)
Рамеш

Да, работает отлично!
Грэм


2

Пожалуйста, попробуй

редактировать: удаленный якорь

echo 'abc:fjk' |sed 's/.*:/john.doe/g'

и удалить

echo 'abc:fjk' |sed 's/.*://g'

это не то, о чем просит ОП
iruvar

пожалуйста, перечитайте вопрос еще раз.
Акаш

Ну, ты пробрался в удаление после моего комментария, не
бери в

а ну понятно . мои извинения 1_CR
Акаши

1
^Якорь не имеет никакого значения в случае , если ни вопрос или в вашем примере дела. Любой адрес, начинающийся с, /.*уже подразумевает ^.
mikeserv
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.