Если вы хотите представить меню своему пользователю, подумайте о команде 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.
Здесь я предполагаю bash . Сообщите нам, если это не та оболочка, которую вы используете.
Если вы застряли в оболочке без массивов, вы можете сделать это, поскольку объекты представляют собой простые слова:
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
$ 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
У вас есть:
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 протестируйте и распечатайте, если у вас есть пустой файл.
Мое предложение 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;
Печать каждой записи (строки )с терминалом ;
, за исключением случаев, когда строка начинается с 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;