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');

Jawaban:



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');

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.