Як використовувати 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}'

Відповідно до коментарів 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}'

1
Якщо ви збираєтесь використовувати awk, чому б не просто зробити awk -F:?
Graeme

@Graeme, мені все ще не так зручно awk. В основному я намагаюся перевірити команди, які я спочатку отримав у своїй відповіді, і намагаюся змінити їх відповідно до вимог користувача. :)
Рамеш

3
-FВаріант для awkЗадає роздільник полів. Якщо ви скажете awkвикористовувати двокрапку, не потрібно замінювати двокрапки на вкладки. Крім того, якщо ви хочете отримати останнє поле, яке ви можете використовувати $NFзамість $4, це буде спрацьовувати, якщо не завжди є три колони.
Graeme

@Graeme, я включив зміни, які ви згадали. Будь ласка, дайте мені знати, чи це добре :)
Рамеш,

Так, працює чудово!
Graeme


2

Будь ласка, спробуй

редагувати: знято якір

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

і видалити

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

це не те, що просить ОП
iruvar

будь ласка, перечитайте питання ще раз.
акаш

Добре, ви пробралися в видаленні після мого коментаря, неважливо
iruvar

о Я бачу . мої вибачення 1_CR
акаш

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