Разобрать файл строка за линию и помните, когда вы видите СЛУЧАЙ или END.
Код ниже использует короткий синтаксис для оператора if и эха, который подавляет \ n параметром -n.
incase=0
cat x.sql | while read -r line; do
[[ ${line} = CASE* ]] && incase=1;
[[ ${line} = END* ]] && incase=0
[[ ${incase} = 0 ]] && echo "${line}"
[[ ${incase} = 1 ]] && echo -n "${line} "
done
EDIT:
Если у вас есть вложенные МИОНЫ (например, случай ... случай ... END ... END) и все МИОНОВ начинают на разных линиях, вы можете рассчитывать, насколько глубоко ваш вложенными.
incase=0
cat x.sql | while read -r line; do
[[ ${line} = CASE* ]] && ((incase = incase + 1)) ;
[[ ${line} = END* ]] && ((incase = incase - 1))
[[ ${incase} = 0 ]] && echo "${line}"
[[ ${incase} > 0 ]] && echo -n "${line} "
done
# You might want an extra echo here so your last line will finish with a \n
echo
EDIT 2: Часто вы можете избежать кошки (ищите UUOC). Вот код лучше, как
incase=0
cat x.sql | while read -r line; do
[[ ${line} = CASE* ]] && incase=1;
[[ ${line} = END* ]] && incase=0
[[ ${incase} = 0 ]] && echo "${line}"
[[ ${incase} = 1 ]] && echo -n "${line} "
done
EDIT:
Если у вас есть вложенные МИОНы (например, случай ... случай ... END ... END) и все МИОНы начинают на разных линиях, вы можете рассчитывать, как глубоко вложен.
incase=0
while read -r line; do
[[ ${line} = CASE* ]] && ((incase = incase + 1)) ;
[[ ${line} = END* ]] && ((incase = incase - 1))
[[ ${incase} = 0 ]] && echo "${line}"
[[ ${incase} > 0 ]] && echo -n "${line} "
done < x.sql
# You might want an extra echo here so your last line will finish with a \n
echo
это довольно широкий. Какова логика, лежащая в основе этого? что вы пробовали? – fedorqui
Мой сценарий похож ... У меня есть SQL-файл, в котором эти операторы case похожи на это .... Я хочу удалить все символы новой строки между оператором case и end –