sed: substitui apenas o primeiro intervalo de números

4

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');
    
por Marit Hoen 10.09.2012 / 13:11

3 respostas

3

Use awk em vez de sed :

awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'
    
por 10.09.2012 / 13:58
1

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');
    
por 10.09.2012 / 13:16
0

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) .

    
por 10.09.2012 / 14:57

Tags