ذكري المظهر

كيفية استخدام sed لإيجاد واستبدال السلسلة في الملفات

طريقة فك قفل الشاشة والرمز السري للاندرويد عند نسيانه بدون فورمات او روت

طريقة فك قفل الشاشة والرمز السري للاندرويد عند نسيانه بدون فورمات او روت

جدول المحتويات:

Anonim

في كثير من الأحيان عند العمل مع الملفات النصية ، ستحتاج إلى البحث عن سلاسل نصية واستبدالها في ملف واحد أو أكثر.

sed هو s tream ed itor. يمكن أن تؤدي معالجة النصوص الأساسية على الملفات وتدفقات الإدخال مثل خطوط الأنابيب. باستخدام sed يمكنك البحث عن الكلمات والخطوط sed واستبدالها وإدراجها وحذفها. وهو يدعم التعبيرات العادية والممتدة التي تتيح لك مطابقة الأنماط المعقدة.

سنتحدث عن كيفية العثور على الأوتار واستبدالها بـ sed . سنعرض لك أيضًا كيفية إجراء بحث متكرر واستبداله.

البحث واستبدال سلسلة مع sed

هناك العديد من إصدارات sed ، مع بعض الاختلافات الوظيفية بينهما. يستخدم macOS إصدار BSD ومعظم توزيعات Linux تأتي مع GNU sed مثبتة بشكل افتراضي. سوف نستخدم نسخة جنو.

يتخذ الشكل العام للبحث واستبدال النص باستخدام sed الشكل التالي:

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - بشكل افتراضي ، يكتب sed إخراجه إلى الإخراج القياسي. هذا الخيار يخبر sed بتحرير الملفات في مكانها. إذا تم توفير ملحق (على سبيل المثال ، i.bak) ، فسيتم إنشاء نسخة احتياطية من الملف الأصلي. s - الأمر البديل ، وربما أكثر الأوامر استخدامًا في sed. / / / - حرف محدد. يمكن أن يكون أي حرف ولكن عادةً ما يتم استخدام حرف شرطة مائلة ( / ). SEARCH_REGEX - سلسلة عادية أو تعبير عادي للبحث عنه. REPLACEMENT - سلسلة استبدال. g - العلم البديل العالمي. SEARCH_REGEX للإعدادات الافتراضية ، يقوم sed بقراءة سطر الملف بسطر وتغيير التواجد الأول فقط لـ SEARCH_REGEX على السطر. عند توفير علامة الاستبدال ، سيتم استبدال جميع التكرارات. INPUTFILE - اسم الملف الذي تريد تشغيل الأمر عليه.

من الممارسات الجيدة وضع علامات الاقتباس حول الوسيطة حتى لا تتوسع أحرف تعريف shell.

دعونا نرى أمثلة على كيفية استخدام الأمر sed للبحث واستبدال النص في الملفات مع بعض الخيارات والأعلام الأكثر استخدامًا.

لأغراض العرض التوضيحي ، سنستخدم الملف التالي:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

مع استبدال العلم العالمي sed يستبدل كل تكرارات نمط البحث:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

كما لاحظت ، في المثال السابق ، يتم أيضًا استبدال السلسلة الفرعية الموجودة داخل سلسلة foobar . إذا لم يكن هذا هو السلوك المطلوب ، فاستخدم تعبير كلمة boundery ( \b ) في طرفي سلسلة البحث. هذا يضمن عدم مطابقة الكلمات الجزئية.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

لجعل حالة تطابق النمط غير حساسة ، استخدم إشارة I في المثال أدناه ، نستخدم كل من g و I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

الخيار الأسهل والأكثر قابلية للقراءة هو استخدام حرف محدد آخر. يستخدم معظم الأشخاص الشريط العمودي ( | ) أو النقطتين (:) ولكن يمكنك استخدام أي شخصية أخرى:

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

يمكنك أيضا استخدام التعبيرات العادية. على سبيل المثال ، للبحث في جميع الأرقام الثلاثة واستبدالها number السلسلة الذي ستستخدمه:

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

ميزة أخرى مفيدة من sed هو أنه يمكنك استخدام حرف علامة الضم والذي يتوافق مع النمط المتطابق. شخصية يمكن استخدامها عدة مرات.

على سبيل المثال ، إذا كنت تريد إضافة أقواس متعرجة {} حول كل رقم مكون من 3 أرقام ، فاكتب:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

أخيرًا وليس آخرًا ، من الأفضل دائمًا عمل نسخة احتياطية عند تحرير ملف باستخدام sed . للقيام بذلك ، ما عليك سوى توفير امتداد لخيار -i . على سبيل المثال ، لتحرير file.txt وحفظ الملف الأصلي باسم file.txt.bak ستستخدم:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

البحث العودية واستبدالها

في بعض الأحيان تريد البحث بشكل متكرر الدلائل عن الملفات التي تحتوي على سلسلة واستبدال السلسلة في جميع الملفات. يمكن القيام بذلك باستخدام أوامر مثل find أو grep للعثور على الملفات بشكل متكرر في الدليل وتوصيل أسماء الملفات إلى sed .

سيبحث الأمر التالي بشكل متكرر عن الملفات في دليل العمل الحالي sed أسماء الملفات إلى sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

لتجنب المشكلات المتعلقة بالملفات التي تحتوي على مساحة بأسمائها ، استخدم الخيار -print0 الذي يروي find عن طباعة اسم الملف ، متبوعًا بحرف فارغ وإخراج الإخراج إلى sed باستخدام xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

لاستثناء دليل ، استخدم خيار -not -path . على سبيل المثال ، إذا كنت تستبدل سلسلة في ملف git repo المحلي لاستبعاد جميع الملفات التي تبدأ بالنقطة ( . ) ، فاستخدم:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

هناك خيار آخر يتمثل في استخدام أمر grep للبحث عن جميع الملفات التي تحتوي على نمط البحث بشكل متكرر ثم توجيه أسماء الملفات إلى sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

استنتاج

على الرغم من أن الأمر قد يبدو معقدًا ومعقدًا ، إلا أن البحث عن نص واستبداله في ملفات باستخدام sed هو أمر بسيط للغاية.

لمعرفة المزيد حول أوامر sed ، والخيار ، والأعلام ، تفضل بزيارة دليل GNU و Grymoire sed التعليمي. إذا كان لديك أي أسئلة أو تعليقات ، فلا تتردد في ترك تعليق.

محطة sed