2015-04-13 2 views
1

У меня есть строка, какСЕПГ позиционная замена с регулярным выражением

SELECT dateAdd(dd,-90, MAX(col_name)) FROM table_123_name 

, и я хочу, чтобы выход как

SELECT MAX(col_name) -90 from table_123_name 

Я попытался с

cat test.txt|sed "s/dateadd(dd,//I g"|sed 's/\(\[select\]\)\([ \s\t]*\)\([0-9-]*\)\(\[,\]\)\([ \s\t]*\)\([A-Za-z0-9(_]*[)]*\)/SELECT \6)\3/I g' 

но регулярное выражение замены не работающих

+0

это «простой» выбор, но есть ли другой выбор, который нельзя принимать во внимание или иметь почти такую ​​же структуру, как и выбранное другое поле, а также учитывать? – NeronLeVelu

ответ

1

Вы могли бы сделать так,

$ echo 'SELECT dateAdd(dd,-90, MAX(col_name)) FROM table_123_name' | sed 's/dateadd(dd,\([^,]*\), *\([^) ]*)\)) *\(.*\)/\2 \1 \L\3/gi' 
SELECT MAX(col_name) -90 from table_123_name 

i модификатор в последний помогает сделать матч регистронезависимое и \L\3 превращает все символы, присутствующие внутри третьей группы захвата в нижнем регистре.

0

Вы можете сделать это, как это с awk:

awk '/dateAdd/ {split($2,a,",");print $1,$3,a[2],tolower($4),$5}' file 
SELECT MAX(col_name)) -90 from table_123_name 

Если вам нужны другие критерии для поиска из чем /dateAdd/, а затем просто изменить его на то, что вам нужно.

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