3

У меня есть список пользователей в основном из /etc /group, я бы хотел отформатировать эту строку в один столбец, мне просто нужны пользователи. Так что если поле выглядит так:

bob,john,jane,sam,joyce

Тогда я бы хотел, чтобы это выглядело так

bob
john
jane
sam
joyce

Я знаю, как сделать наоборот, но не этот тип.

5 ответов5

4

Вы можете сделать это с помощью sed:

sed 's/,/\n/g'

Это заменяет все , с новой строки. g заставляет sed заменять все вхождения в строке вместо первого.

0

Вы можете сделать это с помощью поиска и замены в vim:

:%s/,/\r/g

Смотрите этот вопрос ...

0

Несколько вариантов:

tr:

tr ',' '\n' < [input file] > [output file]

tr - это инструмент, который фильтрует его стандартный ввод и заменяет каждое вхождение символа из его первого аргумента совпадающим из второго элемента, а затем печатает в стандартный вывод.

vim/ex (это будет работать в скрипте):

vim -c "%s/,/\r/g" -c "wq" [input file]

Опция -c указывает vim запустить следующую команду ex (то же, что вы вводите после a : при обычном использовании vim).

И кто-то уже избил меня до седа.

0

Чтобы ответить, используя предложенные вами теги:

Баш:

$ IFS=, read -a names <<< "bob,john,jane,sam,joyce"
$ printf "%s\n" "${names[@]}"
bob
john
jane
sam
joyce

AWK:

$ echo "bob,john,jane,sam,joyce" | awk -F, -v OFS="\n" '{$1=$1; print}'
bob
john
jane
sam
joyce

Бит $1=$1 - это идиома awk для перезаписи текущей записи с использованием разделителей выходных полей, что не происходит, если не изменить какое-либо поле.

0

Если вы хотите использовать awk (аналогично « Печатать все поля с AWK, разделенными OFS»):

echo "bob,john,jane,sam,joyce" | awk  'BEGIN {FS=","; OFS="\n"} {$1=$1; print $0}'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .