Как соединить линию с образцом и следующую линию с седом?

Вам необходимо отредактировать файл / etc / passwd , чтобы изменить домашний каталог пользователей, которые в данный момент вошли в систему.

Измените / etc / passwd на sudo vipw и измените домашний каталог пользователя.

vipw настоятельно рекомендуется, кроме vim или других редакторов, поскольку vipw установит блокировку для предотвращения любого повреждения данных.

0
17.12.2018, 08:34
3 ответа

Другой вариант :создать скрипт ed!

Это начинается с предварительного -подсчета количества необходимых соединений; затем он генерирует это количество edкоманд поиска и объединения и направляет их вместе с сохранением и выходом в конце вed:

#!/bin/bash
n=$(grep -c '^module *$' input)
{
  for((i=1; i <= n; i++))
  do
    printf '/^module *$/\n.,+1j\n'
  done
  echo w
  echo q
} | ed -s input >/dev/null
1
28.01.2020, 02:18

Вам нужно соединить строки moduleсо следующей строкой.

Использованиеsed:

$ sed '/^module/N;s/\n//' file
module  x(a,b,c)
module  y(d,e,f,
g,h,i)
module  z(j,k,l)

Данные копируются и вставляются как есть, с пробелами в конце каждой строки.

Команда sedбудет печатать каждую строку по мере ее чтения, но когда она встречает строку, начинающуюся со строки module, она добавляет следующую строку со встроенным символом новой строки в -между (это то, что Nделает ). Мы удаляем этот символ новой строки с заменой до того, как результат будет напечатан.

Если в ваших данных нет пробелов в конце строк, используйте

$ sed '/^module/N;s/\n/ /' file
module x(a,b,c)
module y(d,e,f,
g,h,i)
module z(j,k,l)

На тот случай, если вам понадобится (без пробелов в конце строк ввода):

$ sed -e '/^module/bpp' -e 'H;$bpp' -e 'd' \
      -e ':pp' -e 'x;/^$/d;s/\n/ /g' file
module x(a,b,c)
module y(d,e,f, g,h,i)
module z(j,k,l)

Аннотированный sedсценарий:

/^module/ b print_previous; # print previous record
H;                          # append this line to hold space
$         b print_previous; # print previous (last) record
d;                          # end processing this line

:print_previous;            # prints a record accumulated in the hold space
x;                          # swap in the hold space
/^$/ d;                     # if line is empty, delete it
s/\n/ /g;                   # replace embedded newlines by spaces
                            # (implicit print)
12
28.01.2020, 02:18

Использование awk:

~ awk '/^module/ {l = $0; getline; printf "%s", l} 1' input-file
module  x(a,b,c)
module  y(d,e,f,
g,h,i)
module  z(j,k,l)

Для каждой строки, начинающейся с module, сохраните строку в l, перейдите к следующей строке(getline)и напечатайте сохраненную строку без новой строки. Затем распечатайте каждую строку.

2
28.01.2020, 02:18

Теги

Похожие вопросы