У меня есть файл с именами функций и переменным количеством имен пользователей ниже:
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