في مناسبات معينة ، نريد استبدال النص داخل ملف ، على سبيل المثال ، التغيير في Document.txt كل ما تقوله "عائلتي" "لنا". لتحقيق ذلك ، يمكننا استخدام محرر النصوص المفضل لدينا (Kate ، Gedit ، SublimeText ، إلخ) ولكن من الجيد دائمًا معرفة المتغيرات والطرق الأخرى لتحقيق نفس النتيجة 🙂
يحدث ذلك مع التعبيرات العادية يمكنك تحقيق ذلك ، فالأمر sed رائع بكل بساطة ، وله متغيرات وخيارات لا حصر لها ولكن ... لأولئك الذين يريدون فقط استبدال النص من الطريقة الأقل تعقيدًا الممكنة، بالنسبة لهم هو أنني أحضر هذا البديل الأبسط بكثير:
باتباع المثال ، لدينا الملف Document.txt وتقع في $ HOME / Document.txt بالنص التالي:
(...) عائلتي إنه مثلهم جميعًا ، مثلك أو جارك. في الواقع عائلتي نحاول أن نكون أشخاصًا مسؤولين وفي نظر المجتمع ، صحيحين سياسيًا واجتماعيًا. ومع ذلك ، يوجد في منزلي خروف أسود ، وهذا دوري LOL!. لقد كنت دائمًا الشخص الذي لا يخشى قول ما يفكر فيه (حتى لو لم يكن ذلك صحيحًا في نظر المجتمع) ، على الرغم من أن عائلتي سئمت في الواقع من
قذارةمجتمع اليوم.
بالأمر التالي سوف تغير «عائلتي" بواسطة "لنا":
perl -pi -e "s[mi familia][nosotros]g" $HOME/Documento.txt
الأمر بهذه البساطة
لذلك سيكون النص:
(...) لنا إنه مثلهم جميعًا ، مثلك أو جارك. في الواقع لنا نحاول أن نكون أشخاصًا مسؤولين وفي نظر المجتمع ، صحيحين سياسيًا واجتماعيًا. ومع ذلك ، يوجد في منزلي خروف أسود ، وهذا دوري LOL!. لقد كنت دائمًا الشخص الذي لا يخشى قول ما يفكر فيه (حتى لو لم يكن ذلك صحيحًا في نظر المجتمع) ، على الرغم من أن عائلتي سئمت في الواقع من
قذارةمجتمع اليوم.
الصيغة هي:
perl -pi -e "s[lo-que-quiero-cambiar][lo-nuevo-a-poner]g" archivo-en-el-cual-reemplazar
قد يبدو الأمر معقدًا بعض الشيء ، فلنقم بتفصيله قليلاً وشرحه بشكل أكثر بساطة 😉
- بيرل : ما سوف نستخدمه ، بيرل
- -بي : باي ، كيف π (القيمة التقريبية 3.14)
- -e : E تخيلها لـ «تنفيذ e» ^ - ^
- ثم في الاقتباسات » نفتح مع s ونختتم بـ g: "sg" ... تخيل S لبداية و G لـ Game Over 😀
- بدوره بين sg يجب أن نضع مجموعتين من الأقواس: [] y []، على هذا النحو: "S [] [] g"
- داخل الأقواس الأولى كما قلت أعلاه ، سيظهر النص الذي نريد إزالته واستبداله بآخر جديد ، بينما في المجموعة الثانية من الأقواس ، سيظهر النص الجديد المراد وضعه ، باتباع المثال: "S [عائلتي] [نحن] ز"
بسيط أليس كذلك؟
التفسير هو في الواقع أكثر شمولاً مما هو ضروري للأمر ، فمن السهل جدًا فهم 🙂
Perl هي أكثر بكثير من مجرد وسيلة لاستبدال النص ، إنها لغة كاملة 😉
إذا كنت تريد معرفة المزيد عنها ، فقم بتثبيت الحزمة بيرل-وثيقة وإلقاء نظرة على ما يسمح به ، إنه مجرد كون مختلف.
بالمناسبة وللإغلاق ، بافتراض أنك تريد العثور على جميع ملفات .txt التي لديك في $ HOME / Documents / وفي كل منها استبدل "عائلتي" بـ "us" ، يمكنك الانضمام إلى find + perl لتحقيق ذلك:
find $HOME/Documentos/ -name *.txt -exec perl -p -i -e "s[mi familia][nosotros]g" {} \;
أو باستخدام حرف بدل:
perl -p -i -e "s[mi familia][nosotros]g" $HOME/Documentos/*.txt
تكمن مشكلة هذا المتغير الثاني في أنه لن يحل محل الملفات الموجودة في المجلدات الفرعية 🙂
على أي حال ، أتمنى أن تكون قد وجدت ذلك ممتعًا. بالنسبة لي كان مفيدًا حقًا ، يمكنني بالفعل استبدال النص مباشرةً من الجهاز ... رائع! 😀
حسنًا ، أعتقد أن الكثيرين منا هنا يعرفون الأمر sed ، والذي يخدم نفس الغرض ، فهو يفعل ذلك بشكل أفضل بكثير ويسهل استخدامه ...
شكرا على تعليقك،
تفصيلان فقط ، لماذا تقول أن sed يجعلها أفضل؟ هل من الأسهل حقًا استخدامه مع العديد من الشخصيات "الغريبة"؟
تحياتي للجميع!!!. لقد استخدمت الأمر عطش، والطريقة الموصوفة هنا باستخدام perl أبسط. شكرا KZKG ^ Gaara !!!.
شكرا على التعليق 🙂
حسنًا ، على الأقل يبدو لي أن هذا أبسط من التعبيرات العادية ... أنه مع وجود العديد من الشخصيات "الغريبة" ، يمكن فعل شيء معقد حقًا لفهمه وتعلمه لغير الأذكياء.
هناك قول مأثور "قديم": "واجهت مشكلة ، قررت استخدام التعبيرات العادية ... الآن لدي مشكلتان"
هاهاهاهاها !!!
يمكن للتعبيرات العادية أن تنقذ حياتنا في مرحلة معينة ... نعم ، يستغرق الأمر وقتًا طويلاً لتعلم كيفية استخدامها وعدم الموت أثناء المحاولة.
لو كنت قد عرفت هذه الوصية منذ سنوات يا الله !! كم كانت حياتي بسيطة
واضح! حسن التعامل معها فهي قوية جدا 🙂 لا شيء أفضل لمعالجة النص. لكن في بعض الأحيان ، كما تقول في هذه الحالة مع Perl ، لا يتعين عليك الذهاب إلى هذا الحد إذا كان الاستبدال كافياً.
كنت سأستخدم بايثون على أي حال :)
لكن في العطش أرى الأمر أبسط ... هل أقوم بشيء خاطئ؟
sed -i "if / what-I-want-to-change / new-to-put /" file-in-which-to-replace
هيه هيه ... وإذا أردت استبدال "http://my.blog.com/content/" بـ "http://my.blog.com/uploads/files/" ... هناك بالفعل لديك لوضع \ مع المساحات وغيرها ، ويصبح معقدا ام لا؟
ليس من الضروري استخدام / كفاصل. انظر مع +
sed -i «s + http: //my.blog.com/content/+http: //my.blog.com/uploads/files/+» ملف
O_O… WTF!
لقد فتحت لي الآن عالمًا كاملاً من الخيارات .. O_O
أنا أحب هذه المنشورات حيث نتعلم جميعًا شيئًا ما
لم أكن أعرف ذلك أيضًا.
أنا أفضل استخدام السادس مباشرة ..
ببساطة:
:٪ s / لنا / عائلتي / g
٪ -> المستند بأكمله
ق -> البحث
ز -> جميع التكرارات
تحيات ..
بفضل!
لم أكن أعرف كيف أفعل ذلك مع vi
تمت الإضافة إلى المفضلة!
بفضل!
ألقِ نظرة عليه إذا كان لديك القليل من الأمر rpl
http://microbuffer.wordpress.com/2011/02/28/rpl-buscar-y-reemplazar-strings-en-linux-unix/
إدخال رائع! في حالة اهتمام أي شخص ، نفس الشيء مع أمر Linux sed: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
وماذا يحدث إذا كان ما أريد استبداله داخل الملف يحتوي على علامات اقتباس؟
مثال استبدل ما يقول النص: »1 ″ بالنص:» 2 ″
كيف يكون الأمر؟
حولا
أردت استبدال سلسلة بها علامة @ في المنتصف وقمت فقط بتغيير النص إلى ما قبل at.
النص المطلوب تغييره: تحيا بيرو
نص جديد: Viva mi patriapercysalgado
ظاهر: عاش وطني
شكرا لمساعدتكم
"\" يجب عليك استخدام الشرطة المائلة قبل الأحرف ذات الاستخدام المزدوج @ ، # ، حتى يتم تفسيرها على أنها نص.
وكيف أفعل ذلك في الويندوز ؟؟؟؟