Назад | Перейти на главную страницу

Как соединить переменное количество строк

У меня есть файл с именами функций и переменным количеством имен пользователей ниже:

Feature1

user1

user2

Feature2

user3

Я хотел бы иметь возможность переместить имена пользователей в ту же строку, что и имя функции (по строкам команды vi join). Имена функций начинаются с заглавной буквы, а имена пользователей - с строчной. Есть ли способ сделать это?

Это довольно легко с sed:

sed ':a;N;$!ba;s/\n\+\([a-z]\)/ \1/g;'

Небольшое описание, как это работает:

:a;N;$!ba; добавит все строки в шаблон соответствия. нам нужно удалить все символы новой строки на следующем шаге. s/\n\+\([a-z]\)/ \1/g; удалит все символы новой строки перед user* и сохраните символы новой строки перед Feature*. Кстати, это также можно сделать с

tr '\n' ' ' | sed 's/ \([A-Z]\)/\n\1/g'


 $ cat test_file
Feature1

user1

user2
Feature2

user3
Feature2
user3
user3

ouser3

user3

 $ sed ':a;N;$!ba;s/\n\+\([a-z]\)/ \1/g;' test_file
Feature1 user1 user2
Feature2 user3
Feature2 user3 user3 ouser3 user3

В AWK это очень просто:

awk '/^[[:upper:]]/ {if (line) {print line}; line = $0} /^[[:lower:]]/ {line = line " " $0} END {if (line) {print line}}'

Вы захотите разбить свои данные на части перед их записью. Что-то вроде следующего псевдокода (вам нужно будет самостоятельно преобразовать его в правильный синтаксис BASH).

out_line=""
for in_line in $(cat $file); do
  if $(echo in_line | egrep ^Feature) != ""
    echo $out_line >> $out_file
    out_line="$in_line"
  else
    out_line="$out_line $in_line"
  fi
done
echo $out_line >> $out_file