Use awk
em vez de sed
:
awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'
Imagine que eu tenha um arquivo de entrada como este:
INSERT INTO video_item_theme VALUES('9', '29');
INSERT INTO video_item_theme VALUES('19', '312');
INSERT INTO video_item_theme VALUES('414', '1');
E desejo adicionar 10000 apenas ao primeiro intervalo de números, por isso acabo com algo parecido com isto:
INSERT INTO video_item_theme VALUES('10009', '29');
INSERT INTO video_item_theme VALUES('10019', '312');
INSERT INTO video_item_theme VALUES('10414', '1');
Minha abordagem seria prefixar "1000" a números de um dígito, "100" Algo como ...:
sed 's/[0-9]\{2\}/10&/g'
... não é muito útil, pois altera cada ocorrência de dois números, não apenas na primeira ocorrência de números:
INSERT INTO video_item_theme VALUES('9', '10029');
INSERT INTO video_item_theme VALUES('10019', '100312');
INSERT INTO video_item_theme VALUES('100414', '1');
Use awk
em vez de sed
:
awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'
Eu não sei se há uma maneira elegante de fazer isso com um comando (e acho que não), mas você pode facilmente fazer isso com um comando por tamanho de números:
sed -e "s/'\([0-9]\{1\}\)',/\'1000\',/g"
sed -e "s/'\([0-9]\{2\}\)',/\'100\',/g"
sed -e "s/'\([0-9]\{3\}\)',/\'10\',/g"
O truque para mudar apenas os números que você quer é incluir algum contexto no padrão, aqui as aspas simples e a vírgula, para que seu padrão seja único em suas strings.
O resultado de cada comando é o seguinte:
$ sed -e "s/'\([0-9]\{1\}\)',/\'1000\',/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\',/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\',/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');
Mesma solução que Ansgar Wiechers , mas em perl
:
perl -F\' -lane '$F[1] += 10000; print join "7", @F' infile
-a
divide automaticamente em @F
em '
. -n
faz um loop sobre cada linha. Veja perlrun(1)
.