string - استبدل سطر كامل يحتوي على سلسلة باستخدام Sed




shell (7)

لدي ملف نصي يحتوي على خط معين مثل

sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext

أحتاج إلى استبدال الخط الكامل أعلاه بـ

This line is removed by the admin.

الكلمة الرئيسية للبحث هي TEXT_TO_BE_REPLACED

أحتاج إلى كتابة برنامج نصي shell لهذا. كيف يمكنني تحقيق ذلك باستخدام sed ؟


إنه مشابه لما ورد أعلاه ..

sed 's/[A-Za-z0-9]*TEXT_TO_BE_REPLACED.[A-Za-z0-9]*/This line is removed by the admin./'

الجواب أعلاه:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

يعمل بشكل جيد إذا لم يكن سطر / سلسلة الاستبدال متغيرًا.

المشكلة هي أن Redhat 5 في \ بعد أن تهرب c من $ . لم يعمل \\ double (على الأقل على Redhat 5).

من خلال ضرب والمحاكمة ، اكتشفت أن \ بعد c لا لزوم لها إذا كان لديك سلسلة / خط الاستبدال فقط سطر واحد. لذلك لم أكن استخدم \ بعد c ، استخدم متغير كخط بديل واحد وكان الفرح.

سيبدو الرمز كالتالي:

sed -i "/TEXT_TO_BE_REPLACED/c $REPLACEMENT_TEXT_STRING" /tmp/foo

لاحظ استخدام علامات الاقتباس المزدوجة بدلاً من علامات الاقتباس الفردية.


في makefile الخاص بي ، استخدم هذا:

@sed -i '/.*Revision:.*/c\'"`svn info -R main.cpp | awk '/^Rev/'`"'' README.md

ملاحظة: لا تنس أن -i يغير النص الموجود في الملف ... لذلك إذا تغير النمط الذي قمت بتعريفه كـ "مراجعة" ، سوف تقوم بتغيير نمط استبداله.

مثال على الناتج:

Abc-Project كتبه John Doe

المراجعة: 1190

لذا إذا قمت بتعيين النمط "Revision: 1190" فمن الواضح أنه ليس هو نفسه كما قمت بتعريفهم كـ "المراجعة:" فقط ...


كثيرا ما أستخدم regex لاستخراج البيانات من الملفات التي استخدمتها للتو لاستبدال الاقتباس الحرفي \" مع // لا شيء :-)

cat file.csv | egrep '^\"([0-9]{1,3}\.[0-9]{1,3}\.)' | sed  s/\"//g  | cut -d, -f1 > list.txt

يجب استخدام wildards ( .* ) قبل وبعد لاستبدال السطر بالكامل:

sed 's/.*TEXT_TO_BE_REPLACED.*/This line is removed by the admin./'

يمكنك استخدام الأمر change لاستبدال السطر بأكمله ، -i لإجراء التغييرات في المكان. على سبيل المثال ، باستخدام GNU sed:

sed -i '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo

ملاحظة: في OSX تحتاج إلى تثبيت "brew install gnu-sed --with-default-default" لدعم أسلوب نمط جنو -i


cat find_replace | while read pattern replacement ; do
sed -i "/${pattern}/c ${replacement}" file    
done 

يحتوي ملف find_replace على عمودين ، c1 مع نمط لمطابقة ، c2 مع الاستبدال ، حلقة sed تحل محل كل خط conatining واحد من نمط متغير 1





sed