#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')
$