У меня есть неструктурированный файл, и я хотел бы найти и заменить шаблон строк.
- Должен заменить строку, которая существует между строками SELECT и FROM; тот, кто находится вне этого шаблона, должен оставаться как есть.
Формат файла похож на
col4 is required to be upper so
make col4 upper
abc 12345 !$% DATA SELECT
col1 as col1,
col2 as col2.
col3,
sch.col4 as col4,
sch.tab.col4 as col4_1,
col4,
col5 FROM sch.tab
xyz 34354 ^&* DATA SELECT
col5 as col5,
col3,
col4,
col4 as col4,
col4 FROM
blah blah blah
Я хочу заменить:
col4,
с upper(col4) as col4,
sch.col4
с upper(sch.col4)
sch.tab.col4
с upper(sch.tab.col4)
col4
(если col4 находится в конце запроса выбора) с upper(col4) as col4
Файл находится на сервере Linux, и я попытался с помощью sed и awk сузить строки, содержащие col4, но не смог оттуда двигаться вперед.
Мне удалось идентифицировать один шаблон, используя ниже
awk '/SELECT/,/FROM/' test_file.txt | awk '/col4/{print $0, NR}' | awk -F AS '{print $1}'
Найти текст между SELECT и FROM
Определите строки, которые имеют col4
напечатать первое поле
sed -n -e '/SELECT/,/FROM/p' -e 's/\(\([a-zA-Z]\{1,\}\.\)\{0,\}\)col4/upper(\0)/g' test_file.txt
и с использованием sed
Фактический:
col4 is required to be upper so
make col4 upper
abc 12345 !$% DATA SELECT
col1 as col1,
col2 as col2.
col3,
sch.col4 as col4,
sch.tab.col4 as col4_1,
col4,
col5 FROM sch.tab
xyz 34354 ^&* DATA SELECT
col5 as col5,
col3,
col4,
col4 as col4,
col4 FROM
blah blah blah
Ожидаемый результат:
col4 is required to be upper so
make col4 upper
abc 12345 !$% DATA SELECT
col1 as col1,
col2 as col2.
col3,
upper(sch.col4) as col4,
upper(sch.tab.col4) as col4_1,
upper(col4) as col4,
col5 FROM sch.tab
xyz 34354 ^& DATA SELECT
col5 as col5,
col3,
upper(col4) as col4,
upper(col4) as col4,
upper(col4) as col4 FROM
blah blah blah
Любая помощь очень ценится!