استبدل نصًا معينًا في جميع الملفات باستخدام أمر shell واحد
-
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