Ваши данные состоят из шести;
-полей с разделителями, и вы хотите заменить точки в полях со 2 по 5 (, а не 1 или 6 )запятыми.
Это проще всего сделать с помощьюawk
:
awk -F ';' 'BEGIN { OFS=FS } { for (i=2; i<=5; ++i) gsub("\\.", ",", $i); print }' file
С приведенными примерными данными получается
2019-03-17T11:32:28.143343Z;1234,5678;901,234;567,89012;3456,78;192.168.0.1
Код просто выполняет итерацию полей с разделителями;
-каждой строки ввода и вызывает gsub()
для выполнения глобального поиска и замены (, как вы сделали бы с s/\./,/g
или y/./,/
вsed
)на отдельные поля, по которым повторяется цикл.
Затем распечатывается измененная строка.
Опция -F
устанавливает разделитель полей ввода в виде точки с запятой, и мы используем блок BEGIN
, чтобы также установить разделитель полей вывода на то же значение (, что в противном случае вы получили бы поля, разделенные пробелом -).
Используя sed
, вы можете сделать что-то вроде
sed 's/\./,/2; s/\./,/2; s/\./,/2; s/\./,/2' file
То есть, замените 2-ю точку четыре раза (, какая из них является 2-й точкой, будет меняться при каждой замене, поскольку вы заменяете их ). Однако это предполагает, что количество значений в каждом поле остается постоянным.
Чтобы обойти эту проблему, если в какой-то момент у вас есть более двух -точек, разделенных полем, вы можете
sed 'h; s/^[^;]*;//; s/;[^;]*$//; y/./,/; G;H;x; s/;[^\n]*\n/;/; s/\n.*;/;/' file
Короче говоря, эти команды выполняют
y
). Все точки, которые должны были превратиться в запятые, теперь изменены. Теперь мы должны собрать строку из среднего бита в пространстве шаблонов и исходных данных в пространстве хранения. Создайте (с помощью G;H;x
), чтобы пространство шаблонов содержало
Итак, теперь пространство шаблонов содержит три строки . Удалите все, кроме первого поля в первой строке и новой строки, и замените этот удаленный бит на ;
.
Сделайте то же самое с последней строкой, то есть удалите (теперь одинокую )новую строку и все до последней ;
и замените на ;
.
Готово.
Или вы можете просто использовать код awk
.
Существует множество отличий, главное из которых заключается в том, что sudo -s
зависит от пользователя, имеющего привилегии sudoer, тогда как su root
требует, чтобы пользователь имел пароль root.
В качестве примечания -
С точки зрения безопасности гораздо лучше назначать пользователям привилегии sudoer для доступа к корневой оболочке, чем передавать пароль root, который пользователи могут использовать через su root
. Если у пользователя есть пароль root, он может получить root в любое время. Если им назначены привилегии через /etc/sudoers
, то доступ к корневой оболочке может быть отозван в любое время.