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

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

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

hd_ma_prod_customer_ro:*:123456789:john.doe

с джоном.доу

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

решение1

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

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

Объяснение:

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

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

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

решение2

Другой метод с использованием awk:

awk -F: '{ print $NF }'

решение3

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}'

решение4

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

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

и удалить

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

Связанный контент