Con el comando visudo
editaste el archivo /etc/sudoers
, que solo aplica si antepones tus comandos con sudo
, en tu caso sudo service nginx start
.
Использование цикла Sed:
sed -e 's/,/\n/2' -e 'P;D' file
Пр.
$ echo '201012,720,201011,119,201710,16' | sed -e 's/,/\n/2' -e 'P;D'
201012,720
201011,119
201710,16
Это заменяет второе ,
на \n
, затем печатает и удаляет \n
до тех пор, пока замена больше не будет успешной.
BSD не понимает новую строку как \n
в правой части команд s
, это обходной путь для оболочек ksh, bash, zsh:
sed -e :a -e $'s/,/\\\n/2' -e 'P;D' file
Или общее решение для (старых )seds:
sed '
:a
s/,/\
/2
P;D
' file
$ paste -d, - - < <( tr ',' '\n' <file )
201012,720
201011,119
201710,16
или, без замены процесса,
$ tr ',' '\n' <file | paste -d, - -
201012,720
201011,119
201710,16
Это заменяет все запятые в файле новыми строками, используя tr
, затем использует paste
для создания двух столбцов, разделенных запятой.
Если tr
кажется слишком простым, вы можете заменить его на sed 'y/,/\n/'
, который делает то же самое.
Мне удалось сделать это с помощью следующей команды awk:
awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input
Это будет перебирать каждый столбец во входных данных (, увеличивая на 2 каждую итерацию )и печатать этот столбец плюс следующий соседний столбец в строке перед переходом к следующему.
$ cat input
201012,720,201011,119,201710,16
$ awk -F, -v OFS=, '{for (i=1;i<=NF;i=i+2) {j=i+1; print $i,$j}}' input
201012,720
201011,119
201710,16
awk -F'\n' -vRS=, '{l=$1; $0=""; getline; print l RS $1}'
или
awk -F'\n' -vRS=, '{print $1 RS (getline > 0 ? $1 : "")}'
Вы можете опустить -F'\n'
, если поля не содержат пробелов. Или установите его на то же значение, что и разделитель записей (, например. с -F,
), если ваши поля могут также содержать новые строки (, если, например. в выводе echo 1,2,3,4
последнее поле должно быть 4\n
, а не4
).
Использование xargs
иprintf
:
xargs -d, printf '%s,%s\n' < file
Выход:
201012,720
201011,119
201710,16
Приведенный выше код предполагает, что каждая строка содержит четное количество полей. Если нет, xargs
напечатает одиночные числа и оборванные запятые. Но этот несколько более медленный код должен справиться почти со всем :
tr, '\n' < file | xargs -n2 printf '%s,%s\n' | sed '$s/,$//'
Который можно ускорить, увеличив -n2
до некоторого разумного максимального четного числа, например. предположим, что ни одно число во входных данных не длиннее 15 цифр:
m=$(getconf ARG_MAX) m=$(( (m/16) + (m%2) ))
tr, '\n' < file | xargs -n"${m}" printf '%s,%s\n' | sed '$s/,$//'
На основе оболочки:
(set -f; IFS=','; printf '%s,%s\n' $(< file))
измените на $(cat file)
, если не используете ksh,bash,zsh (т.е. :тире и др. ).
Ограничено памятью (или другими ограничениями ресурсов, используемых для экземпляра оболочки, используемого )в оболочках, которые реализуют printf
как встроенные(большинство оболочек ). Или по значению ARG _MAX в оболочках (, т.е. ksh88 ), которые вызывают execve
для выполнения командной строки.
Другое sed
решение:
sed 's/\([^,]*,[^,]*\),/\1\n/g' file
Это заменяет каждую вторую запятую новой строкой.
Вы можете использоватьgrep
-имейте в виду, что не все версии поддерживают -o
и что это не будет работать для нечетного числа полей
grep -E -o '[^,]+,[^,]+' file
Или перебор
gawk 'BEGIN{FPAT="[^,]+,[^,]+";OFS="\n"}; {$1=$1; print}' file