LINUX.ORG.RU

sed. Удалить все символы до :

 


0

2

Было:

lara:x:1005:1006::/home/lara:/bin/bash
oracle:x:1006:1007::/home/oracle:/bin/bash
systemd-bus-proxy:x:998:216:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:997:215:systemd Network Management:/:/sbin/nologin

Надо получить:

:x:1005:1006::/home/lara:/bin/bash
:x:1006:1007::/home/oracle:/bin/bash
:x:998:216:systemd Bus Proxy:/:/sbin/nologin
:x:997:215:systemd Network Management:/:/sbin/nologin

Я написал:

cat /etc/passwd | sed "s/^[a-zA-Z]*:/:/g"

Работает, но проблемы возникают с systemd-network из-за -. Экранирую:

cat /etc/passwd | sed "s/^[a-zA-Z/-]*:/:/g"

Всё работает. а что, если ещё там будут символ _? Этот код не работает:

cat /etc/passwd | sed "s/^[a-zA-Z\-\_]*:/:/g"

Как сделать, чтобы он удалял -_ и т.д.?

★★★

Минус в группе должен быть либо первым, либо последним: [a-zA-Z0-9_-]

Но проще заменить на что-нибудь вроде sed 's/[^:]*//'

ddos3
()

Можно вообще без sed

cat /etc/passwd | grep -o :.*

Deleted
()

Можно без sed ещё и так

while read S; do echo ":${S#*:}"; done < /etc/passwd

OldManClone ★★
()

Вы неверно ставите задачу, отсюда и не можете ее решить. Это не «удаление всех символов до :», это вывод всех полей в colon-separated file, кроме первого (ну и плюс еще начальный разделитель).

sed здесь совершенно неуместен (да он, собственно, почти нигде не уместен). Делается это как-то так:

#!/bin/bash

while IFS=':' read -r first rest; do
    printf ':%s\n' "$rest"
done

или так:

#!/usr/bin/gawk -E

BEGIN {
    OFS = FS = ":";
}

{
    $1 = "";
    print;
}
Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Согласен, если нужно оставить первый ':', то cut не подходит.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.