
Как заменить следующую строку
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'