4

Представьте, что у меня есть такой входной файл:

INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('414', '1');

И я хочу добавить 10000 только к первому диапазону чисел, поэтому я получаю что-то вроде этого:

INSERT INTO video_item_theme VALUES('10009', '29');
INSERT INTO video_item_theme VALUES('10019', '312');
INSERT INTO video_item_theme VALUES('10414', '1');

Мой подход заключается в том, чтобы префикс "1000" к однозначным числам, "100" что-то вроде ...:

sed 's/[0-9]\{2\}/10&/g' 

... не очень полезно, так как оно меняет каждое вхождение двух чисел, а не только первое вхождение чисел:

INSERT INTO video_item_theme VALUES('9', '10029');
INSERT INTO video_item_theme VALUES('10019', '100312');
INSERT INTO video_item_theme VALUES('100414', '1');

3 ответа3

3

Используйте awk вместо sed:

awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'
1

Я не знаю, есть ли элегантный способ сделать это с помощью одной команды (и я так не думаю), но вы можете легко сделать это с помощью одной команды на длину номера:

sed -e "s/'\([0-9]\{1\}\)',/\'1000\1\',/g"
sed -e "s/'\([0-9]\{2\}\)',/\'100\1\',/g"
sed -e "s/'\([0-9]\{3\}\)',/\'10\1\',/g"

Хитрость для изменения только тех чисел, которые вы хотите, состоит в том, чтобы включить в шаблон некоторый контекст, здесь одинарные кавычки и запятую, чтобы ваш шаблон был уникальным в ваших строках.

Результат каждой команды следующий:

$ sed -e "s/'\([0-9]\{1\}\)',/\'1000\1\',/g" test
INSERT INTO video_item_theme VALUES('10009', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('414', '1');

$ sed -e "s/'\([0-9]\{2\}\)',/\'100\1\',/g" test
INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('10019', '312');
INSERT INTO video_item_theme VALUES('414', '1');

$ sed -e "s/'\([0-9]\{3\}\)',/\'10\1\',/g" test
INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('10414', '1');
0

То же решение, что и у Ansgar Wiechers, но в perl:

perl -F\' -lane '$F[1] += 10000; print join "\047", @F' infile
  • -a автоматически расщепляется на @F at ' .
  • -n циклы над каждой строкой.

Смотрите perlrun(1) .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .