sed: ganti hanya rentang angka pertama

4

Bayangkan saya memiliki file input seperti ini:

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

Dan saya ingin menambahkan 10.000 hanya pada kisaran angka pertama, jadi saya berakhir dengan sesuatu seperti ini:

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

Pendekatan saya adalah awalan "1000" ke satu angka digit, "100" Sesuatu seperti ...:

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

... tidak terlalu membantu, karena ini mengubah setiap kemunculan dua angka, tidak hanya pada kemunculan angka pertama:

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

Jawaban:

3

Gunakan awksebagai ganti sed:

awk -F"'" '{OFS="'"'"'"; $2=$2+10000; print}'
Ansgar Wiechers
sumber
1
+1 ini mungkin sedikit lebih mudah dibaca:OFS="'\''"
glenn jackman
1

Saya tidak tahu apakah ada cara yang elegan untuk melakukannya dengan satu perintah (dan saya rasa tidak), tetapi Anda dapat dengan mudah melakukannya dengan satu perintah per panjang angka:

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"

Trik untuk mengubah hanya angka yang Anda inginkan adalah dengan memasukkan beberapa konteks dalam pola, di sini tanda kutip tunggal dan koma, sehingga pola Anda unik di string Anda.

Hasil dari setiap perintah adalah sebagai berikut:

$ 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');
m4573r
sumber
Panggil saya bodoh, tapi itu membuat saya: INSERT INTO video_item_theme VALUES ('9', '10029'); INSERT INTO video_item_theme VALUES ('10019', '100312'); Masukkan ke video_item_theme VALUES ('100414', '1');
Marit Hoen
mungkin itu masalah sintaksis. Saya memperbarui jawaban saya dan mengujinya, saya memiliki hasil yang Anda inginkan
m4573r
Jangan ragu untuk memvalidasi jawabannya;)
m4573r
0

Solusi yang sama dengan Ansgar Wiechers , tetapi dalam perl:

perl -F\' -lane '$F[1] += 10000; print join "\047", @F' infile
  • -apemisahan otomatis menjadi @Fpada '.
  • -n loop di setiap baris.

Lihat perlrun(1).

Thor
sumber