2015-04-09 3 views
0

Я использую Unix Shell. Как удалить символ новой строки между двумя конкретными строками.Удалить символ новой строки между двумя конкретными строками

Например, вход:

CASE when a in ('abcd','bdcdf') then 
    Shng, 
END as xyz 

Вывод должен быть:

CASE when a in ('abcd','bdcdf') then Shng END as xyz, 
+0

это довольно широкий. Какова логика, лежащая в основе этого? что вы пробовали? – fedorqui

+0

Мой сценарий похож ... У меня есть SQL-файл, в котором эти операторы case похожи на это .... Я хочу удалить все символы новой строки между оператором case и end –

ответ

0

Разобрать файл строка за линию и помните, когда вы видите СЛУЧАЙ или 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 
+0

будет ли он работать, если у меня есть вложенные операторы case? извините, но я новичок в unix-скриптах –

+0

Новое в сценариях unix, получайте удовольствие, я скорректировал ответ. Замечание: '[[sometest]] && action' означает' if [[sometest]]; затем действие; fi' –

Смежные вопросы