سؤال

لدي بعض 150 الملفات في نفوسهم أريد أن إزالة هذه البرمجية التالية:

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/height.js"></SCRIPT>

ما أقوم به هو:

sed -e 's/<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript" SRC="/height.js"></SCRIPT>/ /' file_names

هذا لا يبدو أن العمل.

أريد أن إزالة هذا البرنامج النصي من جميع الملفات دفعة واحدة.كيف يمكن أن أفعل ذلك ؟

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

المحلول

عليك أن تقلق بشأن مائلة في النص الذي يتم استبدال.

  • إما:استخدام '\/'كل مائل ،
  • أو:الغش واستخدام '.'لتتناسب مع أي حرف في هذه النقطة حيث مائل يجب أن تظهر.

البديل يستغل عدم احتمال ملف يحتوي على HTML.نظريا, إذا كنت لا ترغب في البديل الثاني ، يجب عليك أيضا استخدام '\. في كل نقطة فيها '.'يظهر في سلسلة كنت تبحث في.

sed -e 's/<SCRIPT LANGUAGE="JavaScript" TYPE="text.javascript" SRC=".height.js"><.SCRIPT>/ /' file_names

هذا نسخ من المثال الخاص بك ومائلة يتم استبدال النقاط.ومع ذلك وتوريد جميع أسماء الملفات على سطر الأوامر مثل التي سوف ببساطة كتابة انتاج سلسلة من كافة الملفات التي تم تعديلها إلى الإخراج القياسي.

كلاسيكي, تحرير ملفات أكثر أو أقل في الموقع, كنت تكتب:

tmp=${TMPDIR:-/tmp}/xxx.$$
trap 'rm -f $tmp; exit 1' 0 1 2 3 13 15
for file in ...list...
do
    sed -e '...' $file > $tmp
    mv $tmp $file
done
rm -f $tmp
trap 0

ويشمل هذا معقول واقية من الرصاص تنظيف المؤقتة - أنها ليست مثالية.هذا البديل تدعم الأصلي قبل استبدال ذلك مع النسخة المعدلة:

tmp=${TMPDIR:-/tmp}/xxx.$$
trap 'rm -f $tmp; exit 1' 0 1 2 3 13 15
for file in ...list...
do
    sed -e '...' $file > $tmp
    mv $file $file.bak
    mv $tmp $file
done
rm -f $tmp
trap 0

مع جنو sed, يمكنك استخدام '-i'أو '--in-place'الخيار الكتابة فوق الملفات ؛ يمكنك استخدام '--in-place=.bak'لإنشاء نسخ احتياطية من كل file في file.bak.

نصائح أخرى

تحتاج إلى الهروب من أحرف خاصة إضافية مائل.

لاحظ أن الناتج أيضا نذهب جميعا إلى وحدة التحكم.إذا كنت تريد 150 منفصلة ملفات الإخراج, قد ترغب في النظر في xargs الأمر شيئا مثل:

ls -1 | xargs -t-i 'sed-e-i "محل التعليق" {}'

تكون على علم أن sed 'أنا' الخيار تحرير الملفات في المكان حتى تحصل على الاستبدال الحق أولا و الملفات حتى!

ويجب عليك أنابيب الانتاج منها مثلا.

sed -e 's/<.*SRC="\/height.js".*>//g' < foo.html > foo1.html

لم يكن لديك إلى استخدام / مع s الأمر:

sed 's|old|new|' files...

إذا كنت تريد أن تفعل مضمنة-استبدال ، ثم هو الخطوة الأولى عمل نسخة احتياطية من جميع الملفات الخاصة بك ثم إصدار هذا الأمر ، بديل "القديم" و "الجديد" مع سلاسل من اختيارك:

sed -i .bak 's|old|new|' files...

لأن مضمنة استبدال أمر خطير جدا, لا أستطيع التأكيد بما فيه الكفاية التي يجب أن عمل نسخة احتياطية من جميع الملفات الخاصة بك قبل تشغيل الأمر.

أنا لم أذكر أنه يجب أن عمل نسخة احتياطية من جميع الملفات الخاصة بك?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top