sed regex для нескольких вхождений группы захвата

#regex #awk #sed

#регулярное выражение #awk #sed

Вопрос:

У меня есть файл SQL, который состоит из нескольких строк, подобных этой:

 INSERT INTO mytable VALUES (1,2,3,'foo'),(2,4,5,'bar'),(3,5,9,'baz'),...;
INSERT INTO mytable VALUES (10,2,3,'foo'),(11,4,5,'bar'),(12,5,9,'baz'),...;
  

И я хочу добавить пятый столбец к каждому кортежу в каждой строке, например

 INSERT INTO mytable VALUES (1,2,3,'foo','txt_foo'),(2,4,5,'bar','txt_bar'),(3,5,9,'baz','txt_baz'),...;
INSERT INTO mytable VALUES (10,2,3,'baz','txt_baz'),(11,4,5,'bar', 'txt_bar'),(12,5,9,'foo','txt_foo'),...;
  

Какой будет команда sed или awk, которая выполнит работу? Я пробовал несколько комбинаций регулярных выражений, но, похоже, оно не выбирает ни одно из вхождений или выбирает всю строку.

Я пытался, например:

 sed -E "s/((d ),(d ),(d ),'(.*)')/(1,2,3,'4','txt_4')/g" /myfile.sql
  

И это ничего не делает.

Ответ №1:

Вы можете использовать это sed :

 sed -E "s/'([^'] )')/'1', 'txt_1')/g" file
  

 INSERT INTO mytable VALUES (1,2,3,'foo', 'txt_foo'),(2,4,5,'bar', 'txt_bar'),(3,5,9,'baz', 'txt_baz'),...;
INSERT INTO mytable VALUES (10,2,3,'foo', 'txt_foo'),(11,4,5,'bar', 'txt_bar'),(12,5,9,'baz', 'txt_baz'),...;
  

Комментарии:

1. Разумное наблюдение и решение. 1

2. Работает как шарм! Спасибо миллион!

Ответ №2:

Вы также можете попробовать Perl. Здесь $ q сохраняет одинарные кавычки в шестнадцатеричной форме x27

 $ cat antonio.sql
INSERT INTO mytable VALUES (1,2,3,'foo'),(2,4,5,'bar'),(3,5,9,'baz')
INSERT INTO mytable VALUES (10,2,3,'foo'),(11,4,5,'bar'),(12,5,9,'baz')

$ perl -pe ' $q="x27"; s/$q(. ?)$q)/$q$1$q,${q}txt_$1$q)/g  ' antonio.sql
INSERT INTO mytable VALUES (1,2,3,'foo','txt_foo'),(2,4,5,'bar','txt_bar'),(3,5,9,'baz','txt_baz')
INSERT INTO mytable VALUES (10,2,3,'foo','txt_foo'),(11,4,5,'bar','txt_bar'),(12,5,9,'baz','txt_baz')

$