استبدل نصًا معينًا في جميع الملفات باستخدام أمر shell واحد

StackOverflow https://stackoverflow.com/questions/2522677

  •  22-09-2019
  •  | 
  •  

سؤال

لدي ملف JS الذي أعيد تسميته والذي يجب علي الاتصال به في كل صفحة من صفحة PHP الخاصة بي. الآن أريد استبدال هذا الاسم القديم بالسمات الجديدة باستخدام Shell. ما أستخدمه هو:-

sed -i ’s/old/new/g’ *

لكن هذا يعطي الخطأ التالي:-

sed: -e expression #1, char 1: unknown command:

الآن كيف يمكنني القيام بهذا البديل ؟؟

هل كانت مفيدة؟

المحلول

ربما يكون هناك حلول أقل مطوّلة ، ولكن هنا نذهب:

for i in *; do sed -i 's/old/new/g' "$i"; done

ضع في اعتبارك أنه لن يعمل إلا على المستوى الحالي لنظام الملفات ، ولن يتم تعديل الملفات في الدلائل الفرعية. أيضًا ، قد ترغب في استبدال * بـ * .php ، أو إجراء نسخ احتياطية (تمرير وسيطة بعد -i ، وسوف تجعل نسخة احتياطية مع امتداد معين).

نصائح أخرى

sed -i.bak 's/old/new/g' *.php

للقيام بذلك بشكل متكرر

find /path -type f -iname '*.php' -exec sed -i.bak 's/old/new/' "{}" +;

أنت تستخدم unicode apostrophes (علامة اقتباس واحدة يمينًا - U2019) بدلاً من ASCII (0x27) sed حجة القيادة.

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

grep -rl 'oldText' [folderName-optional] | xargs sed -i 's/oldText/newText/g'

perl -pi -e 's/old/new/g' *.php

للاكتمال ، توفير النسخة المتوافقة مع OSX من الإجابة المقبولة أعلاه (للإجابة على التعليق من @JamesCampbell)

for i in *.php; do sed -i .orig 's/old/new/g' "$i"; done

هذا الأمر يخلق .orig ملفات النسخ الاحتياطي.

أعلم أنني متأخر حقًا ولكن ما زلت:

find . -type f -name "*.php"|xargs sed -i 's/old/new/g'

استخدام عروض أسعار مزدوجة

sed -i "s/old/new/g" *

جرب هذا:

ls | grep "php" > files.txt
for file in $(cat files.txt); do
    sed 's/catch/send/g' $file > TMPfile.php && mv TMPfile.php $file
done
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top