С помощью sed или awk переместите шаблон соответствия строк в конец файла - PullRequest
1 голос
/ 13 мая 2019

У меня похожая проблема. Мне нужно переместить строку в / etc / sudoers в конец файла.

Строка, которую я хочу переместить:

#includedir /etc/sudoers.d

Я пытался с переменной

#creates variable value
templine=$(cat /etc/sudoers | grep "#includedir /etc/sudoers.d")

#delete value
sed '/"${templine}"/d' /etc/sudoers

#write value to the bottom of the file
cat ${templine} >> /etc/sudoers

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

Есть предложения?

Ответы [ 4 ]

2 голосов
/ 13 мая 2019

С awk:

awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' /etc/sudoers

То есть:

  1. Если строка $0 равна "#includedir /etc/sudoers.d", тогда установите для переменной lastline значение этой строки $0 и переходите к следующей строке next.
  2. Если вы все еще здесь, выведите строку {print $0}
  3. После обработки каждой строки в файле выведите все, что находится в переменной lastline.

Пример:

$ cat test.txt
hi
this
is
#includedir /etc/sudoers.d
a
test
$ awk '$0=="#includedir /etc/sudoers.d"{lastline=$0;next}{print $0}END{print lastline}' test.txt
hi
this
is
a
test
#includedir /etc/sudoers.d
1 голос
/ 13 мая 2019

Это может работать для вас (GNU sed):

sed -n '/regexp/H;//!p;$x;$s/.//p' file

Удаляет строки, содержащие указанное регулярное выражение, и добавляет их в конец файла.

Только кпереместите первую строку, которая соответствует регулярному выражению, используйте:

sed -n '/regexp/{h;$p;$b;:a;n;p;$!ba;x};p' file

При этом используется цикл для чтения / печати оставшейся части файла, а затем добавление совпавшей строки.

1 голос
/ 13 мая 2019

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

sed -e '/#includedir .etc.sudoers.d/ { h; $p; d; }' -e '$G' /etc/sudoers
0 голосов
/ 13 мая 2019

Если у вас есть несколько записей, которые вы хотите переместить в конец файла, вы можете сделать следующее:

awk '/regex/{a[++c]=$0;next}1;END{for(i=1;i<=c;++i) print a[i]}' file

или

sed -n '/regex/!{p;ba};H;:a;${x;s/.//;p}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...