O'lchovlarni topish va almashtirish faqat ma'lum miqdordagi voqealar uchun o'zgartiriladi

Quyidagi muammo bor.

Menda ketma-ketlikdagi fayl bor va ma'lum bir naqshni topib, boshqa naqsh bilan almashtirmoqchiman, faqat ma'lum bir vaqt uchun.

Masalan:

ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN

Men "DEFGHI" ni topib, uni "ABCDEF" bilan faqat 3 marta almashtirmoqchiman.

sed -i 's/DEFGHI/ABCDEF/g' /home/user/test.txt

Men butun dunyoni almashtirishni xohlamayman; Buning o'rniga faqat 3 marta almashtirmoqchiman.

1
qo'shib qo'ydi muallif zdim, manba
qo'shib qo'ydi muallif zdim, manba
qo'shib qo'ydi muallif zdim, manba
Men bu savolni mavzudan tashqarida qoldirish uchun ovoz beraman, chunki vazifa tavsifi aniq emas va OP O'chirish uchun talablarga javob bermaydi. (Xususan: Chizma bitta qatorda bir martadan ortiq ko'rinishi mumkinmi?) Chizma chiziqda bir martadan kamroq ko'rinishi mumkinmi (ya'ni, baribir mos kelmaydigan satrlar bormi?)
qo'shib qo'ydi muallif melpomene, manba
Men bu savolni mavzudan tashqarida qoldirish uchun ovoz beraman, chunki vazifa tavsifi aniq emas va OP O'chirish uchun talablarga javob bermaydi. (Xususan: Chizma bitta qatorda bir martadan ortiq ko'rinishi mumkinmi?) Chizma chiziqda bir martadan kamroq ko'rinishi mumkinmi (ya'ni, baribir mos kelmaydigan satrlar bormi?)
qo'shib qo'ydi muallif melpomene, manba
Men bu savolni mavzudan tashqarida qoldirish uchun ovoz beraman, chunki vazifa tavsifi aniq emas va OP O'chirish uchun talablarga javob bermaydi. (Xususan: Chizma bitta qatorda bir martadan ortiq ko'rinishi mumkinmi?) Chizma chiziqda bir martadan kamroq ko'rinishi mumkinmi (ya'ni, baribir mos kelmaydigan satrlar bormi?)
qo'shib qo'ydi muallif melpomene, manba
@toolic Siz har bir satrda bitta o'yin mavjudligini taxmin qilyapsiz (ya'ni u ko'proq yoki kamroq bo'lsa, bu buziladi).
qo'shib qo'ydi muallif melpomene, manba
@toolic Siz har bir satrda bitta o'yin mavjudligini taxmin qilyapsiz (ya'ni u ko'proq yoki kamroq bo'lsa, bu buziladi).
qo'shib qo'ydi muallif melpomene, manba
@toolic Siz har bir satrda bitta o'yin mavjudligini taxmin qilyapsiz (ya'ni u ko'proq yoki kamroq bo'lsa, bu buziladi).
qo'shib qo'ydi muallif melpomene, manba
Bu juda ahamiyatli emas. Naqsh har bir satrda bir martadan ortiq bo'lishi mumkinmi?
qo'shib qo'ydi muallif melpomene, manba
Bu juda ahamiyatli emas. Naqsh har bir satrda bir martadan ortiq bo'lishi mumkinmi?
qo'shib qo'ydi muallif melpomene, manba
Bu juda ahamiyatli emas. Naqsh har bir satrda bir martadan ortiq bo'lishi mumkinmi?
qo'shib qo'ydi muallif melpomene, manba
Nima uchun DEFGHI ni o'zi bilan almashtirmoqchisiz? Kerakli chiqishni ko'rsating.
qo'shib qo'ydi muallif toolic, manba
Nima uchun DEFGHI ni o'zi bilan almashtirmoqchisiz? Kerakli chiqishni ko'rsating.
qo'shib qo'ydi muallif toolic, manba
perl -pi-ning/DEFGHI/ABCDEF/va $ i ++ agar $ i <3 "/home/user/test.txt bo'lsa. Sed bilan hal qilish juda qiyin.
qo'shib qo'ydi muallif stevesliva, manba
perl -pi-ning/DEFGHI/ABCDEF/va $ i ++ agar $ i <3 "/home/user/test.txt bo'lsa. Sed bilan hal qilish juda qiyin.
qo'shib qo'ydi muallif stevesliva, manba
perl -pi-ning/DEFGHI/ABCDEF/va $ i ++ agar $ i <3 "/home/user/test.txt bo'lsa. Sed bilan hal qilish juda qiyin.
qo'shib qo'ydi muallif stevesliva, manba
aniq emas uchun uzr. naqsh faqat bir marta va ba'zi qatorlar uchun naqsh mos kelmaydi .. maslahatlar uchun rahmat
qo'shib qo'ydi muallif manoj, manba
aniq emas uchun uzr. naqsh faqat bir marta va ba'zi qatorlar uchun naqsh mos kelmaydi .. maslahatlar uchun rahmat
qo'shib qo'ydi muallif manoj, manba
aniq emas uchun uzr. naqsh faqat bir marta va ba'zi qatorlar uchun naqsh mos kelmaydi .. maslahatlar uchun rahmat
qo'shib qo'ydi muallif manoj, manba
Kechirasiz. boshqa patten bilan almashtirishni xohlayman. masalan: DEFGHI ABCDEF bilan
qo'shib qo'ydi muallif manoj, manba
Kechirasiz. boshqa patten bilan almashtirishni xohlayman. masalan: DEFGHI ABCDEF bilan
qo'shib qo'ydi muallif manoj, manba
Kechirasiz. boshqa patten bilan almashtirishni xohlayman. masalan: DEFGHI ABCDEF bilan
qo'shib qo'ydi muallif manoj, manba

8 javoblar

Buni bash va GNU yordamida bajarish mumkin:

sed -z -i "$(echo s/DEFGHI/ABCDEF/{3..1}\;)" yourfile
  • The {3..1} results in the the s part repeated three time with flag 3 to 1. Each s command replaces only the third, second and first occurence. The inverted order is necessary, so that the counting and replacing do not mix up.
  • -z takes takes all the input lines at once, thus the counting is not per line but per file.

Malumot uchun, echo atrofidagi buyruqni almashtirish nima bo'ladi:

echo s/DEFGHI/ABCDEF/{3..1}\;
> s/DEFGHI/ABCDEF/3; s/DEFGHI/ABCDEF/2; s/DEFGHI/ABCDEF/1;
2
qo'shib qo'ydi
@SLePort Siz haqsiz. Men ketma-ketlikni o'zgartirdim. Rahmat.
qo'shib qo'ydi muallif Lars Fischer, manba
+ + 1 dan ortiq o'zboshimchalikli qadriyatlar uchun yaxshi ishlaydigan sed + shell combo uchun. Ammo, bu "bras kengaytmasi" aniq bo'lsa ham ... bash? Ya'ni GNU sed + bash va bashlike kabuklar.
qo'shib qo'ydi muallif stevesliva, manba

Buni bash va GNU yordamida bajarish mumkin:

sed -z -i "$(echo s/DEFGHI/ABCDEF/{3..1}\;)" yourfile
  • The {3..1} results in the the s part repeated three time with flag 3 to 1. Each s command replaces only the third, second and first occurence. The inverted order is necessary, so that the counting and replacing do not mix up.
  • -z takes takes all the input lines at once, thus the counting is not per line but per file.

Malumot uchun, echo atrofidagi buyruqni almashtirish nima bo'ladi:

echo s/DEFGHI/ABCDEF/{3..1}\;
> s/DEFGHI/ABCDEF/3; s/DEFGHI/ABCDEF/2; s/DEFGHI/ABCDEF/1;
2
qo'shib qo'ydi
@SLePort Siz haqsiz. Men ketma-ketlikni o'zgartirdim. Rahmat.
qo'shib qo'ydi muallif Lars Fischer, manba
+ + 1 dan ortiq o'zboshimchalikli qadriyatlar uchun yaxshi ishlaydigan sed + shell combo uchun. Ammo, bu "bras kengaytmasi" aniq bo'lsa ham ... bash? Ya'ni GNU sed + bash va bashlike kabuklar.
qo'shib qo'ydi muallif stevesliva, manba

Bu uch marotaba naqsh o'rnini o'zgartiradi, qanday qilib ular satrlarda tarqatiladi

perl -0777 -pe'$i += s/DEF/xxx/ while $i < 3' < data.txt  > out.txt

Bu chiziq chiziqlar bo'yicha buzilmasligini taxmin qiladi. Har safar boshidanoq qidiruvni amalga oshiradi. Bu quyida tushuntirilgan bir eslatma bilan keladi va samarasiz, lekin u oddiy.

Replikatsiya o'zi atrofdagi matn bilan birgalikda naqsh hosil qilsa, bu keyingi o'tish davrida ham o'zgartiriladi. Bunday o'zgarish naqshning bir qismini va muayyan shaklda bo'lishi kerak. Shunday bo'lsa-da, agar bu tashvish bo'lsa, menga xabar bering.

Muammo yuzaga kelishi mumkin bo'lgan chalkash naqshlarni qo'llash aniqlanmagan. Agar ushbu echim birinchi bo'lib o'rnini oladi, shuning uchun keyingi o'tishda bir-biri bilan chalkashib ketgan bo'ladi.

2
qo'shib qo'ydi
@Sidyll tomonidan (o'chirilgan) javob to'g'ri fikrga ega va foydali bo'ldi, rahmat
qo'shib qo'ydi muallif zdim, manba
Comments tomonidan @melpomene foydali, rahmat
qo'shib qo'ydi muallif zdim, manba
@manoj Katta, xush kelibsiz.
qo'shib qo'ydi muallif zdim, manba
rahmat. u maqsadda ishladi .. rahmat
qo'shib qo'ydi muallif manoj, manba

Bu uch marotaba naqsh o'rnini o'zgartiradi, qanday qilib ular satrlarda tarqatiladi

perl -0777 -pe'$i += s/DEF/xxx/ while $i < 3' < data.txt  > out.txt

Bu chiziq chiziqlar bo'yicha buzilmasligini taxmin qiladi. Har safar boshidanoq qidiruvni amalga oshiradi. Bu quyida tushuntirilgan bir eslatma bilan keladi va samarasiz, lekin u oddiy.

Replikatsiya o'zi atrofdagi matn bilan birgalikda naqsh hosil qilsa, bu keyingi o'tish davrida ham o'zgartiriladi. Bunday o'zgarish naqshning bir qismini va muayyan shaklda bo'lishi kerak. Shunday bo'lsa-da, agar bu tashvish bo'lsa, menga xabar bering.

Muammo yuzaga kelishi mumkin bo'lgan chalkash naqshlarni qo'llash aniqlanmagan. Agar ushbu echim birinchi bo'lib o'rnini oladi, shuning uchun keyingi o'tishda bir-biri bilan chalkashib ketgan bo'ladi.

2
qo'shib qo'ydi
Comments tomonidan @melpomene foydali, rahmat
qo'shib qo'ydi muallif zdim, manba
@Sidyll tomonidan (o'chirilgan) javob to'g'ri fikrga ega va foydali bo'ldi, rahmat
qo'shib qo'ydi muallif zdim, manba
@manoj Katta, xush kelibsiz.
qo'shib qo'ydi muallif zdim, manba
rahmat. u maqsadda ishladi .. rahmat
qo'shib qo'ydi muallif manoj, manba

Bu uch marotaba naqsh o'rnini o'zgartiradi, qanday qilib ular satrlarda tarqatiladi

perl -0777 -pe'$i += s/DEF/xxx/ while $i < 3' < data.txt  > out.txt

Bu chiziq chiziqlar bo'yicha buzilmasligini taxmin qiladi. Har safar boshidanoq qidiruvni amalga oshiradi. Bu quyida tushuntirilgan bir eslatma bilan keladi va samarasiz, lekin u oddiy.

Replikatsiya o'zi atrofdagi matn bilan birgalikda naqsh hosil qilsa, bu keyingi o'tish davrida ham o'zgartiriladi. Bunday o'zgarish naqshning bir qismini va muayyan shaklda bo'lishi kerak. Shunday bo'lsa-da, agar bu tashvish bo'lsa, menga xabar bering.

Muammo yuzaga kelishi mumkin bo'lgan chalkash naqshlarni qo'llash aniqlanmagan. Agar ushbu echim birinchi bo'lib o'rnini oladi, shuning uchun keyingi o'tishda bir-biri bilan chalkashib ketgan bo'ladi.

2
qo'shib qo'ydi
Comments tomonidan @melpomene foydali, rahmat
qo'shib qo'ydi muallif zdim, manba
@Sidyll tomonidan (o'chirilgan) javob to'g'ri fikrga ega va foydali bo'ldi, rahmat
qo'shib qo'ydi muallif zdim, manba
@manoj Katta, xush kelibsiz.
qo'shib qo'ydi muallif zdim, manba
rahmat. u maqsadda ishladi .. rahmat
qo'shib qo'ydi muallif manoj, manba

Uch marta uchraydigan birinchi holni o'zgartirishingiz mumkin:

sed -i '0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/' file

chiqdi:

ABCABCDEFJKLMN
ABCABCDEFJKLMN
ABCABCDEFJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
0
qo'shib qo'ydi

Uch marta uchraydigan birinchi holni o'zgartirishingiz mumkin:

sed -i '0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/' file

chiqdi:

ABCABCDEFJKLMN
ABCABCDEFJKLMN
ABCABCDEFJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
0
qo'shib qo'ydi

Uch marta uchraydigan birinchi holni o'zgartirishingiz mumkin:

sed -i '0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/;0,/DEFGHI/s//ABCDEF/' file

chiqdi:

ABCABCDEFJKLMN
ABCABCDEFJKLMN
ABCABCDEFJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
ABCDEFGHIJKLMN
0
qo'shib qo'ydi