Відповіді:
Якщо припустити, що ви насправді маєте на увазі, що ви хочете видалити все до останньої кишки і залишити john.doeнедоторканим:
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' |
sed 's/.*://'
Перший рядок просто передає тест-рядок sedдля, наприклад, цілей.
Друга - основна sedзаміна . Частина між першим і другим /є регулярним виразом для пошуку, а частиною між другим і третім є те, чим його замінити (нічого в цьому випадку ми не видаляємо).
Для регулярного вираження .відповідає будь-якому символу, *повторює це будь-яку кількість разів (включаючи нуль) і :відповідає двокрапці. Так ефективно, це все, за яким слідує двокрапка. Оскільки .*може включати двокрапку, сірник є "жадібним", і все до останньої двокрапки включається.
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}'
Відповідно до коментарів Graeme, ми можемо використовувати awkдля друку останнього стовпчика самостійно, використовуючи NFзмінну, awkяк показано нижче.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | sed -r 's/:/\t/g' | awk -F'\t' '{print $NF}'
Включення коментарів Graeme, щоб позбутися зайвого sed
Команду можна змінити, як показано нижче.
echo 'hd_ma_prod_customer_ro:*:123456789:john.doe' | awk -F':' '{print $NF}'
awk. В основному я намагаюся перевірити команди, які я спочатку отримав у своїй відповіді, і намагаюся змінити їх відповідно до вимог користувача. :)
-FВаріант для awkЗадає роздільник полів. Якщо ви скажете awkвикористовувати двокрапку, не потрібно замінювати двокрапки на вкладки. Крім того, якщо ви хочете отримати останнє поле, яке ви можете використовувати $NFзамість $4, це буде спрацьовувати, якщо не завжди є три колони.
Будь ласка, спробуй
редагувати: знято якір
echo 'abc:fjk' |sed 's/.*:/john.doe/g'
і видалити
echo 'abc:fjk' |sed 's/.*://g'
^Якір не має ніякого значення в разі , якщо ні питання або в вашому прикладі справи. Будь-яка адреса, що починається з /.*вже, означає ^.
awk, чому б не просто зробитиawk -F:?