Объединить несколько строк в одну строку, пока не будет найден шаблон без потери первой части шаблона

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

#  Ask the user which object type they would like to rename
objects=( policy netgroup zonegroup host iprange ipaddr subnet netmap )
PS3="Which network object type would you like to edit? "

select object in "${objects[@]}" all; do
    [[ -n "$object" ]] && break
done

if [[ "$object" == "all" ]]; then
    # comma separated list of all objects
    object=$( IFS=,; echo "${objects[*]}" )
fi

cf -TJK name "$object" q | etc etc etc
#...........^ get into the habit of quoting your variables.

Здесь я предполагаю . Сообщите нам, если это не та оболочка, которую вы используете.


Если вы застряли в оболочке без массивов, вы можете сделать это, поскольку объекты представляют собой простые слова:

objects="policy netgroup zonegroup host iprange ipaddr subnet netmap"
PS3="Which network object type would you like to edit? "

select object in $objects all; do     # $objects is specifically not quoted here...
    [ -n "$object" ] && break
done

if [ "$object" = "all" ]; then
    object=$( set -- $objects; IFS=,; echo "$*" )        #... or here
fi

cf -TJK name "$object" q | etc etc etc

2
28.02.2020, 22:47
4 ответа
$ awk '/^i-/{if (NR>1) print rec; rec=$0 ","; next} {rec=rec $0 ";"} END{print rec}' file
i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3;

или, в зависимости от того, хотите ли вы двоеточие -в конце каждой строки или нет:

$ awk '/^i-/{if (NR>1) print rec; rec=$0; sep=","; next} {rec=rec sep $0; sep=";"} END{print rec}' file
i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3
4
28.04.2021, 23:21

У вас есть:

BEGIN { RS="i-" }
NF>1 {
    print substr( gensub(/\n/,";","g"), 0, length($0)-0)
}

Здесь вы конвертируете несколько строк в одну запись, разделенную символом «i -», чтобы она сразу терялась, и конвертируете NL («\n» )в ';'s. Substr, похоже, мало что для вас делает.

gensub сам по себе применяется повторно, делает то, что вам нужно, как здесь...

BEGIN { RS="i-" }
NF>1 {
    print gensub("^(.*);$", "i-\\1", "g", gensub(/\n/,";","g"))
}

Это зависит от того, что внутренний gensub делает то, что вы делали ранее, конкатенируя несколько полей, конвертируя NL в ';'. Внешний sim принимает это как ввод, добавляет «i -» обратно в начало и обрезает ';' в конце.

В 1 -строке затем:

awk 'BEGIN{RS="i-"}NF>1{print gensub("^(.*);$", "i-\\1", "g", gensub(/\n/,";","g"))}' sg1.txt

Это довольно сложный способ ведения дел. Несколько более естественно просто выразить то, что вы делаете, вот так:

/^i-/ {
    if (line) print line;
    line=$0;
    next
}
{
    line = line";"$0
}
END {
    if (line) print line
}

Когда вы видите строку с ^i -, выведите старое состояние и начните новую строку. Остальные, доп. промыть, повторить. Не забудьте распечатать в конце.

В первый раз протестируйте и распечатайте. В END протестируйте и распечатайте, если у вас есть пустой файл.

0
28.04.2021, 23:21

Мое предложение GNU sed, tr:

tr '\n' ';' < file | sed -E 's/(i-0[^;]*);/\n\1,/g'

Выход:

i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3;
4
28.04.2021, 23:21

Печать каждой записи (строки )с терминалом ;, за исключением случаев, когда строка начинается с i-, будет напечатана следующим образом:

$ awk -vORS=\; '/^i-/{printf "%s%s,",a,$0 ; a="\n";next}1;END{printf "\n"}' file

i-095erwr244r22cfeaa,TF-CLIENT;TF-StKML2;
i-0c23232ac153534c5d,TF-CLIENT;TF-COMMON;TF-STEERR;
i-043434e0934347eb5,TF-CLIENT;TF-ADFS;TF-COMMON;TF-STCLUSTER_1;TF-SwewCLUSTER3;
0
28.04.2021, 23:21

Теги

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