سؤال

أحاول إنشاء أمر استبدال regex في نص bash، ولكن بعد اللعب بعلامات الاقتباس المفردة وعلامات الاقتباس المزدوجة وأحرف الهروب، أقوم بسحب شعري.أستخدم RegEXR لإنشاء الأنماط وتوصلت إلى ما يلي:

انا ابحث عن:

/\.icon-(.*) {\n\t/gm

وأريد استبداله بـ:

if(strpos(\$embedicons,'$1') !== false) { \$svgicons .= <<<'EOD'\n\.$1 {

هذا يحل محل هذا:

.icon-basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

مع هذا:

if(strpos($embedicons,'basket-14-icon') !== false) { $svgicons .= <<<'EOD'
.basket-14-icon {background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

ومع ذلك، فأنا غير ناجح إلى حد كبير في تحقيق ذلك ضمن برنامج نصي bash.لست متأكدًا من أن الأمر ذو صلة، ولكنني أستخدم OSX Mavericks وأستخدم التطبيق الطرفي.على الرغم من أن الأنماط الموجودة في RegExr تبدو منطقية بالنسبة لي، إلا أنني بمجرد أن أبدأ في الهروب منها، أفقد تمامًا ما يحدث.

  1. كيف تتأكد من أن التعبير العادي عالمي ومتعدد الأسطر؟
  2. هل من الأفضل استخدام خيار آخر غير التعبير العادي المدمج؟
  3. هل هناك مورد عبر الإنترنت يعلم (bash) regex لإكمال noobs؟
  4. هل هناك نمط جماعي يطابق كل شيء (بما في ذلك المسافة البيضاء والخطوط الجديدة) حتى سلسلة معينة من الشخصيات مثل العلامة النجمية (*)؟

من الواضح أنني لا أبحث عن صدقة، لأن هذه المشكلة تطاردني بانتظام ...أرغب في تعلم التعبير العادي وحل مشكلاتي من خلال التعلم وقد درست بعض الأمثلة عبر الإنترنت، لكنها تبدو متقدمة جدًا.ربما يوجد منشئ عبر الإنترنت مثل RegExr يترجم إلى إصدارات متوافقة مع bash و PHP من أنماط regex؟


التحديث/الحل:

يبدو أن ما يلي يعمل بالنسبة لي في محطة OSX Mavericks:

sed "s|\.icon-\(.*\) {|if(strpos(\$embedicons,'\1') !== false) { \$svgicons \.= <<<'EOD' \.\1 {|g"
هل كانت مفيدة؟

المحلول

أود أن أقترح استخدام sed لهذا النوع من الاستبدال، هذا الخط سوف يفعل ما تريد:

sed "s/^.icon-\(.*\) {$/if(strpos(\$embedicons,'\1') !== false) { \$svgicons .= <<<'EOD'\n.\1 {/"g input_file.txt

input_file.txt:

.icon-basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

انتاج:

if(strpos($embedicons,'basket-14-icon') !== false) { $svgicons .= <<<'EOD'
.basket-14-icon {
    background-image: url('data:image/svg+xml;charset=US-ASCII,blahblah');
    background-repeat: no-repeat;
}

مع ال -r (التعبير العادي الممتد)، ما عليك سوى الهروب من الأقواس الحرفية وعلامات الدولار المتغيرة في المثال الخاص بك.

وفيما يتعلق بأسئلتك:

  • ال g العلم ل sed يجعلها عالمية.ماذا تقصد بالضبط بـ "متعدد الأسطر"؟يعد إخراج الأسطر الجديدة أمرًا سهلاً باستخدام ، أما المطابقة عبر الأسطر فهي أكثر تعقيدًا بعض الشيء sed تعمل سطرًا تلو الآخر.من الأساليب الشائعة استبدال جميع الأسطر الجديدة في الملف/البيانات بعنصر نائب، وإجراء التعبير العادي/الاستبدال مع وضع العنصر النائب في الاعتبار، ثم استبدال العنصر النائب بأسطر جديدة مرة أخرى.
  • sed ربما يكون هذا هو أفضل رهان لك بالنسبة للأشياء من نوع regex.يمكنك العثور على الوثائق عبر الإنترنت، وهي شاملة إلى حد ما: http://www.grymoire.com/Unix/Sed.html

بالنسبة للجزء الأخير، باستخدام (.*) سوف يلتقط كل شيء، ثم عليك فقط التعامل مع الأسطر الجديدة والتأكد من الهروب من سلسلة الإنهاء الخاصة بك بشكل صحيح.

ملف الاختبار:

testing data with space -
and newlines /'\ *** ends
there

يأمر (tr يتم تبديل الأسطر الجديدة للملدات والعودة مرة أخرى):

tr '\n' '~' < testfile | sed -r 's/(.*)\*\*\*.*/\1/g' | tr '~' '\n'

انتاج:

testing data with space -
and newlines /'\ 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top