سيد
مقتطف من صفحة دليل GNU sed | |
| نموذج | البرمجة النصية |
|---|---|
| صمم بواسطة | لي إي ماكماهون |
| ظهرت لأول مرة | 1974 |
| لغة التنفيذ | ج |
| متأثر بـ | |
| إد | |
| متأثر | |
| بيرل ، AWK | |
sed ("محرر التدفق") هي أداة مساعدة لنظام يونكس تقوم بتحليل النص وتحويله باستخدام لغة برمجة بسيطة ومضغوطة. تم تطويره من عام 1973 إلى عام 1974 بواسطة Lee E. McMahon من Bell Labs ، [1] وهو متاح اليوم لمعظم أنظمة التشغيل. [2] كان sed يعتمد على ميزات البرمجة النصية للمحرر التفاعلي ed ("المحرر"، 1971) والإصدار الأقدم qed ("المحرر السريع"، 1965-1966). كان أحد أقدم الأدوات لدعم التعبيرات العادية ، ولا يزال قيد الاستخدام لمعالجة النصوص، ولا سيما مع أمر الاستبدال. تشمل الأدوات البديلة الشائعة لمعالجة سلسلة النص العادي و"تحرير التدفق" AWK و Perl .
تاريخ
ظهر sed لأول مرة في الإصدار 7 من يونكس ، [3] وهو أحد أوامر يونكس المبكرة المصممة لمعالجة ملفات البيانات من سطر الأوامر. وقد تطور ليكون الخليفة الطبيعي لأمر grep الشهير . [4] كان الدافع الأصلي هو نظير لأمر grep (g/re/p) للاستبدال، ومن ثم "g/re/s". [3] وتوقعًا لظهور المزيد من البرامج ذات الأغراض الخاصة لكل أمر، مثل g/re/d، كتب ماكماهون محرر تدفق موجه للخطوط للأغراض العامة، والذي أصبح sed. [4] نشأ بناء جملة sed، ولا سيما استخدام /لمطابقة الأنماط ، s///وللاستبدال، مع ed ، سلف sed، الذي كان شائع الاستخدام في ذلك الوقت، [4] وقد أثر بناء جملة التعبيرات العادية على لغات أخرى، ولا سيما ECMAScript و Perl . في وقت لاحق، تطورت لغة AWK الأكثر قوة ، وعملت هذه اللغات كأبناء عمومة، مما يسمح بإجراء معالجة نصية قوية بواسطة نصوص shell . غالبًا ما يتم الاستشهاد بـ sed و AWK باعتبارهما مؤسسين ومصدر إلهام لـ Perl، وقد أثرا على بناء الجملة والدلالات في Perl، وخاصة في مشغلي المطابقة والاستبدال.
أضافت GNU sed العديد من الميزات الجديدة، بما في ذلك تحرير الملفات في مكانها. Super-sed هو إصدار ممتد من sed يتضمن تعبيرات عادية متوافقة مع Perl . هناك متغير آخر من sed وهو minised ، والذي تم تصميمه في الأصل عكسيًا من 4.1BSD sed بواسطة Eric S. Raymond ويتم صيانته حاليًا بواسطة René Rebe . تم استخدام minised بواسطة مشروع GNU حتى كتب مشروع GNU إصدارًا جديدًا من sed بناءً على مكتبة التعبيرات العادية الجديدة GNU. يحتوي minised الحالي على بعض الامتدادات لـ BSD sed ولكنه ليس غنيًا بالميزات مثل GNU sed. ميزته أنه سريع جدًا ويستخدم القليل من الذاكرة. يتم استخدامه في الأنظمة المضمنة وهو إصدار sed المقدم مع Minix . [5]
طريقة التشغيل
sed هي أداة معالجة نصية موجهة نحو السطر: فهي تقرأ النص، سطرًا بسطر، من مجرى إدخال أو ملف، إلى مخزن مؤقت داخلي يسمى مساحة النمط . تبدأ كل قراءة سطر دورة . على مساحة النمط، يطبق sed عملية واحدة أو أكثر تم تحديدها عبر نص برمجي sed . ينفذ sed لغة برمجة بها حوالي 25 أمرًا تحدد العمليات على النص. لكل سطر إدخال، بعد تشغيل النص، يقوم sed عادةً بإخراج مساحة النمط (السطر كما تم تعديله بواسطة النص) ويبدأ الدورة مرة أخرى بالسطر التالي. تتوفر سلوكيات أخرى لنهاية النص من خلال خيارات sed وأوامر النص، على سبيل المثال dلحذف مساحة النمط، qوالخروج، Nوإضافة السطر التالي إلى مساحة النمط على الفور، وما إلى ذلك. وبالتالي، يتوافق نص sed مع نص حلقة تتكرر عبر أسطر مجرى، حيث تكون الحلقة نفسها ومتغير الحلقة (رقم السطر الحالي) ضمنيين ويتم صيانتهما بواسطة sed.
يمكن تحديد نص sed إما على سطر الأوامر ( -eخيار) أو قراءته من ملف منفصل ( -fخيار). قد تأخذ الأوامر في نص sed عنوانًا اختياريًا، من حيث أرقام الأسطر أو التعبيرات العادية . يحدد العنوان متى يتم تشغيل الأمر. على سبيل المثال، 2dسيتم تشغيل الأمر (حذف) فقط dعلى سطر الإدخال الثاني (طباعة جميع الأسطر باستثناء الثاني)، بينما /^ /dسيحذف جميع الأسطر التي تبدأ بمسافة. يمكن استخدام مخزن خاص منفصل، مساحة الاحتفاظ ، بواسطة عدد قليل من أوامر sed للاحتفاظ بالنص وتجميعه بين الدورات. تحتوي لغة أوامر sed على متغيرين فقط ("مساحة الاحتفاظ" و"مساحة النمط") ووظيفة التفرع الشبيهة بـ GOTO ؛ ومع ذلك، فإن اللغة كاملة تورينج ، [6] [7] وتوجد نصوص sed غامضة لألعاب مثل sokoban و arkanoid و [8] chess و [9] و tetris . [10]
يتم تنفيذ حلقة رئيسية لكل سطر من مجرى الإدخال، وتقييم نص sed على كل سطر من المدخلات. كل سطر من نص sed هو زوج نمط-إجراء، مما يشير إلى النمط الذي يجب مطابقته والإجراء الذي يجب تنفيذه، والذي يمكن إعادة صياغته كبيان شرطي . نظرًا لأن الحلقة الرئيسية والمتغيرات العاملة (مساحة النمط ومساحة الإيقاف) وتدفقات الإدخال والإخراج والإجراءات الافتراضية (نسخ السطر إلى مساحة النمط، طباعة مساحة النمط) ضمنية، فمن الممكن كتابة برامج موجزة من سطر واحد . على سبيل المثال، برنامج sed معطى بواسطة:
10كيو
سيتم طباعة أول 10 أسطر من الإدخال، ثم التوقف.
الاستخدام
أمر الاستبدال
يوضح المثال التالي الاستخدام النموذجي والأكثر شيوعًا لـ sed: الاستبدال. كان هذا الاستخدام هو الدافع الأصلي لـ sed: [4]
sed 's/regexp/replacement/g' اسم ملف الإدخال > اسم ملف الإخراج
في بعض إصدارات sed، يجب أن يسبق التعبير -eلتوضيح أن تعبيرًا يتبعه. sيرمز the إلى replace، بينما gيرمز the إلى global، مما يعني أنه سيتم استبدال جميع التطابقات في السطر. يتم وضع التعبير العادي (أي النمط) المراد البحث عنه بعد رمز الفصل الأول (الشرطة المائلة هنا) ويتبع الاستبدال الرمز الثاني. الشرطة المائلة ( /) هو الرمز التقليدي، الذي نشأ في الحرف الخاص بـ "search" في ed، ولكن يمكن استخدام أي رمز آخر لجعل بناء الجملة أكثر قابلية للقراءة إذا لم يحدث في النمط أو الاستبدال؛ وهذا مفيد لتجنب " متلازمة عود الأسنان المائل ".
ينفذ أمر الاستبدال، الذي ينشأ في البحث والاستبدال في ed، تحليلًا بسيطًا وقوالب . regexpيوفر كل من مطابقة الأنماط وحفظ النص عبر التعبيرات الفرعية، بينما replacementيمكن أن يكون إما نصًا حرفيًا، أو سلسلة تنسيق تحتوي على الأحرف الخاصة بـ "المطابقة الكاملة" أو تسلسلات الإفلات& الخاصة من خلال التعبير الفرعي المحفوظ رقم n . على سبيل المثال، يستبدل جميع حالات "cat" أو "dog" بـ "cats" أو "dogs"، دون تكرار "s" الموجودة: هو التعبير الفرعي المحفوظ الأول (والوحيد) في التعبير العادي، وفي سلسلة التنسيق يستبدل هذا في الإخراج.
\1\9sed -r "s/(cat|dog)s?/\1s/g"(cat|dog)\1
أوامر sed الأخرى
بالإضافة إلى الاستبدال، هناك أشكال أخرى من المعالجة البسيطة ممكنة، باستخدام حوالي 25 أمرًا من أوامر sed. على سبيل المثال، يستخدم الأمر التالي الأمر d لتصفية الأسطر التي تحتوي فقط على مسافات، أو تحتوي فقط على حرف نهاية السطر:
sed '/^ *$/d' اسم ملف الإدخال
يستخدم هذا المثال بعض أحرف التعريف الخاصة بالتعابير العادية التالية (يدعم sed النطاق الكامل للتعابير العادية):
- تتطابق علامة الإدراج (
^) مع بداية السطر. - علامة الدولار (
$) تتطابق مع نهاية السطر. - تطابق علامة النجمة (
*) صفرًا أو أكثر من تكرارات الحرف السابق. - تتطابق علامة الجمع (
+) مع حدوث واحد أو أكثر من الحرف السابق. - علامة الاستفهام (
?) تطابق صفرًا أو تكرارًا واحدًا للحرف السابق. - النقطة ( ) تطابق حرفًا واحدًا فقط .
.
إن إنشاءات sed المعقدة ممكنة، مما يسمح لها بالعمل كلغة برمجة بسيطة ولكنها متخصصة للغاية . على سبيل المثال، يمكن إدارة تدفق التحكم باستخدام تسمية ( علامة نقطتين متبوعة بسلسلة) وتعليمة الفرع b، بالإضافة إلى الفرع الشرطي t. ستنقل التعليمات bالتي يتبعها اسم تسمية صالح المعالجة إلى الأمر الذي يلي تلك التسمية. tستفعل التعليمات ذلك فقط إذا كان هناك استبدال ناجح منذ السابق t(أو بداية البرنامج، في حالة tمواجهة الأول). بالإضافة إلى ذلك، {تبدأ التعليمات تسلسلًا فرعيًا من الأوامر (حتى المطابقة })؛ في معظم الحالات، سيتم تكييفها بنمط عنوان.
تم استخدام sed كمرشح
في نظام Unix، يتم استخدام sed غالبًا كمرشح في خط الأنابيب :
$ generateData | sed 's/x/y/g'
هذا يعني أن برنامجًا مثل "generateData" يقوم بتوليد البيانات، ثم يقوم sed بإجراء التغيير الصغير المتمثل في استبدال x بـ y . على سبيل المثال:
$ صدى xyz xyz | sed 's/x/y/g' yyz yyz
[ملاحظات 1]
نصوص sed المستندة إلى الملفات
غالبًا ما يكون من المفيد وضع العديد من أوامر sed، أمر واحد لكل سطر، في ملف نصي مثل subst.sed، ثم استخدام -fالخيار لتشغيل الأوامر (مثل s/x/y/g) من الملف:
sed -f subst.sed اسم ملف الإدخال > اسم ملف الإخراج
يمكن وضع أي عدد من الأوامر في ملف البرنامج النصي، كما أن استخدام ملف البرنامج النصي يتجنب أيضًا المشكلات المتعلقة بإفلات shell أو الاستبدالات.
يمكن جعل ملف البرنامج النصي هذا قابلاً للتنفيذ مباشرةً من سطر الأوامر عن طريق إضافة " سطر shebang " إليه يحتوي على الأمر sed وتعيين إذن قابل للتنفيذ للملف. على سبيل المثال، subst.sedيمكن إنشاء ملف يحتوي على المحتويات التالية:
#!/bin/sed -f
s / x / y / g
يمكن بعد ذلك جعل الملف قابلاً للتنفيذ بواسطة المستخدم الحالي باستخدام chmodالأمر:
chmod u+x subst.sed
يمكن بعد ذلك تنفيذ الملف مباشرة من سطر الأوامر:
subst.sed اسم ملف الإدخال > اسم ملف الإخراج
التحرير في المكان
يسمح الخيار -iالذي تم تقديمه في GNU sed بتحرير الملفات في مكانها (في الواقع، يتم إنشاء ملف إخراج مؤقت في الخلفية، ثم يتم استبدال الملف الأصلي بالملف المؤقت). على سبيل المثال:
sed -i 's/abc/def/' اسم الملف
أمثلة
مرحبا بالعالم! مثال
# تحويل مجرى النص المدخل إلى "مرحبًا بالعالم!"
s / .* / مرحبًا بالعالم! /
q
يوجد نص "Hello, world!" هذا في ملف (مثل script.txt) ويتم استدعاؤه باستخدام sed -f script.txt inputFileName، حيث يكون "inputFileName" هو ملف النص المدخل. يغير النص "inputFileName" السطر رقم 1 إلى "Hello, world!" ثم يخرج، ويطبع النتيجة قبل خروج sed. لا تتم قراءة أي أسطر إدخال بعد السطر رقم 1، ولا تتم طباعتها. لذا فإن الناتج الوحيد هو "Hello, world!".
يؤكد المثال على العديد من الخصائص الرئيسية لـ sed:
- تعتبر برامج sed النموذجية قصيرة وبسيطة إلى حد ما.
- يمكن أن تحتوي نصوص sed على تعليقات (السطر الذي يبدأ بالرمز
#). - إن
sالأمر (البديل) هو الأمر الأكثر أهمية في sed. - يسمح sed بالبرمجة البسيطة، باستخدام أوامر مثل
q(quit). - يستخدم sed التعبيرات العادية، مثل
.*(صفر أو أكثر من أي حرف).
أمثلة بسيطة أخرى
فيما يلي العديد من نصوص sed؛ ويمكن تنفيذها عن طريق تمريرها كحجة إلى sed، أو وضعها في ملف منفصل وتنفيذها عبر -fأو عن طريق جعل النص نفسه قابلاً للتنفيذ.
لاستبدال أي مثيل لكلمة معينة في ملف بكلمة "REDACTED"، مثل كلمة مرور IRC، وحفظ النتيجة:
$ sed -i "s/yourpassword/REDACTED/" ./status.chat.log
لحذف أي سطر يحتوي على الكلمة "yourword" (العنوان هو '/yourword/'):
/ كلمتك / د
لحذف جميع حالات الكلمة "yourword":
س / كلمتك // ج
لحذف كلمتين من ملف في نفس الوقت:
ق / الكلمة الأولى // ز
ق / الكلمة الثانية // ز
للتعبير عن المثال السابق على سطر واحد، مثل عند الدخول في سطر الأوامر، يمكن ربط أمرين عبر الفاصلة المنقوطة:
$ sed "s/firstword//g; s/secondword//g" اسم ملف الإدخال
مثال على معالجة متعددة الأسطر
في المثال التالي، تعمل أداة sed، التي تعمل عادةً على سطر واحد فقط، على إزالة الأسطر الجديدة من الجمل التي يبدأ فيها السطر الثاني بمسافة واحدة. ضع في اعتبارك النص التالي:
هذا كلبي الذي اسمه فرانك. هذه سمكتي الذي اسمه جورج. هذه هي عنزتي الذي اسمه آدم.
سيعمل البرنامج النصي sed أدناه على تحويل النص أعلاه إلى النص التالي. لاحظ أن البرنامج النصي يؤثر فقط على أسطر الإدخال التي تبدأ بمسافة:
هذا هو كلبي، اسمه فرانك. هذه سمكتي الذي اسمه جورج. هذه هي جدتي التي اسمها آدم.
النص هو:
ن
س / \n / / ص د
يتم شرح ذلك على النحو التالي:
- (
N) أضف السطر التالي إلى مساحة النمط؛ - (
s/\n / /) ابحث عن سطر جديد يتبعه مسافة، واستبدله بمسافة واحدة؛ - (
P) طباعة السطر العلوي لمساحة النمط؛ - (
D) احذف السطر العلوي من مساحة النمط ثم قم بتشغيل البرنامج النصي مرة أخرى.
يمكن التعبير عن ذلك على سطر واحد عبر الفواصل المنقوطة:
sed ' ' inputFileName
N; s/\n / /; P; D
القيود والبدائل
على الرغم من بساطته ومحدوديته، فإن sed قوي بما يكفي لعدد كبير من الأغراض. لمعالجة أكثر تعقيدًا، يتم استخدام لغات أقوى مثل AWK أو Perl بدلاً من ذلك. تُستخدم هذه اللغات بشكل خاص عند تحويل سطر بطريقة أكثر تعقيدًا من استخراج التعبيرات العادية واستبدال القالب، على الرغم من إمكانية إجراء تحويلات معقدة بشكل تعسفي من حيث المبدأ باستخدام مخزن الإيقاف المؤقت.
على العكس من ذلك، بالنسبة للعمليات الأكثر بساطة، غالبًا ما تكون أدوات يونكس المتخصصة مثل grep (طباعة الأسطر المطابقة للنمط)، وhead (طباعة الجزء الأول من الملف)، و tail (طباعة الجزء الأخير من الملف)، و tr (ترجمة أو حذف الأحرف) مفضلة. بالنسبة للمهام المحددة المصممة للقيام بها، تكون هذه الأدوات المتخصصة عادةً أبسط وأوضح وأسرع من الحل الأكثر عمومية مثل sed.
تستمر أوامر ed/sed وقواعدها النحوية في الاستخدام في البرامج الهابطة، مثل محرري النصوص vi و vim . وهناك نظير لـ ed/sed وهو sam /ssam، حيث sam هو محرر Plan 9 ، وssam هي واجهة تدفق له، مما يوفر وظائف مماثلة لـ sed.
انظر أيضا
ملحوظات
- ^
في استخدام سطر الأوامر، لا تكون علامات الاقتباس حول التعبير مطلوبة، وهي ضرورية فقط إذا لم يكن من الممكن أن يفسر الغلاف التعبير على أنه كلمة واحدة (رمز). بالنسبة للنص البرمجي،
s/x/y/gلا يوجد غموض، وبالتاليgenerateData | sed s/x/y/gيعمل بشكل صحيح. ومع ذلك، عادةً ما يتم تضمين علامات الاقتباس من أجل الوضوح، وغالبًا ما تكون ضرورية، وخاصة للمسافات البيضاء (على سبيل المثال،'s/x x/y y/'). غالبًا ما يتم استخدام علامات الاقتباس المفردة، لتجنب تفسير الغلاف$كمتغير غلاف. تُستخدم علامات الاقتباس المزدوجة، مثل"s/$1/$2/g"، للسماح للغلاف بالاستعاضة عن وسيطة سطر أوامر أو متغير غلاف آخر.
مراجع
- ^ "الأسئلة الشائعة حول sed، القسم 2.1". مؤرشف من الأصل في 2018-06-27 . تم الاسترجاع 2013-05-21 .
- ^ "الأسئلة الشائعة حول sed، القسم 2.2". مؤرشف من الأصل في 2018-06-27 . تم الاسترجاع 2013-05-21 .
- ^ ab McIlroy, MD (1987). قارئ بحث يونكس: مقتطفات موثقة من دليل المبرمج، 1971-1986 (PDF) (تقرير فني). CSTR. مختبرات بيل. 139.
- ^ abcd "حول التاريخ المبكر وتأثير يونكس".
بعد فترة من الوقت، نشأ طلب على برنامج آخر لأغراض خاصة، وهو gres، ليحل محل: g/re/s. تعهد لي ماكماهون بكتابته، وسرعان ما توقع أنه لن تكون هناك نهاية للعائلة: g/re/d، g/re/a، إلخ. ومع تطور مفهومه، أصبح sed…
- ^ Raymond, Eric Steven ; Rebe, René (2017-03-03). "tar-mirror/minised: A larger, cheapest, fastest SED implementation". GitHub . مؤرشف من الأصل في 2018-06-13 . تم الاسترجاع في 2024-05-20 .
- ^ "تنفيذ آلة تورينج كنص برمجي". مؤرشف من الأصل في 2018-02-20 . تم الاسترجاع في 2003-04-24 .
- ^ "Turing.sed". مؤرشف من الأصل في 2018-01-16 . تم الاسترجاع 2003-04-24 .
- ^ "الصفحة الرئيسية لـ $SED - gamez".
- ^ "bolknote/SedChess". GitHub . تم الاسترجاع في 23 أغسطس 2013 .
- ^ "Sedtris، لعبة تتريس مكتوبة لـ sed". GitHub . تم الاسترجاع في 3 أكتوبر 2016 .
قراءة إضافية
- صفحة دليل Unix sed(1) للطبعة الثامنة من Bell Lab (حوالي عام 1985)
- توثيق GNU sed أو صفحة الدليل
- ديل دوجيرتي وأرنولد روبنز (مارس 1997). السيد & AWK (الطبعة الثانية). أورايلي . رقم ISBN 1-56592-225-5.
- أرنولد روبينز (يونيو 2002). sed and awk Pocket Reference (الطبعة الثانية). O'Reilly . ISBN 0-596-00352-8.
- بيتر باتسيس (ديسمبر 1998). كتاب العمل التفاعلي لمبرمجي UNIX AWK وSED (كتاب العمل التفاعلي UNIX) . برنتيس هول . رقم ISBN 0-13-082675-8.
- دانييل جولدمان (فبراير 2013). دليل نهائي لـ sed. EHDP Press. ISBN 978-1-939824-00-4.
- Sourceforge.net، الأسئلة الشائعة حول sed (مارس 2003)
روابط خارجية
- – مرجع Shell and Utilities، مواصفات UNIX الفردية ، الإصدار 4 من The Open Group
- – دليل المبرمج لـ Plan 9 ، المجلد 1
- Sed - مقدمة وبرنامج تعليمي، بقلم بروس بارنيت
- "الصفحة الرئيسية لـ GNU sed".(يتضمن الدليل)
- إريك بيمينت (2004). "أطلق محرر البث".
- إريك س. رايموند . "تنفيذ sed المصغر". ExactCODE .
