كيفية تغيير شكل استبدال المتغيرات في قالب

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

  •  04-07-2019
  •  | 
  •  

سؤال

أحتاج إلى تكرار أكثر من الملفات في دليل وأداء التالية الاستبدال.

قبل:

مرحبا ${USER_NAME} ، كنت تعيش في ${HOME_ADDRESS}.هو الآن ${الوقت}

وبعد:

مرحبا ${userName} ، كنت تعيش في ${homeAddress}.هو الآن ${الوقت}

عدد مختلف الرموز التي تظهر ضمن ${} كبيرة ، لذلك فإنه ليس من الممكن تشغيل:

find . -name '*' -exec sed -i 's/${USER_NAME}/${userName}/g' {} \;
find . -name '*' -exec sed -i 's/${TIME}/${time}/g' {} \;

الخ.

أنا على أمل أنه من الممكن أن تؤدي هذا الاستبدال باستخدام أمر واحد ، التي تبدو شيئا مثل:

find . -name '*' -exec sed 's/XXX/YYY/g' {} \;

ولكن أنا لا يمكن معرفة ماذا بديلا XXX YYY.هل من الممكن أن تفعل هذا في أمر واحد?

الهتافات ، دونال

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

المحلول

على -i العلم sed سوف تحرير ملف في نفس المكان.بالنسبة XXX YYY ، يجب أن تستخدم شيئا مثل:

sed -i 's/USER_NAME/userName/g'

وهلم جرا.

تحديث:أرى أن سؤالك كان عن تغيير "USER_NAME" في "اسم المستخدم" تلقائيا.يمكنك أن تجرب هذا Perl:

sub convert {
    my $r = lc $_[0];
    $r =~ s/_(.)/\U$1\E/g;
    return $r;
}
while (<>) {
    s/\${([A-Z_]+)}/\${@{[convert $1]}}/g;
    print;
}

تشغيل مثل هذا:

perl -i convert.pl inputfile.txt

عينة الإخراج:

$ cat inputfile.txt
Hello ${USER_NAME}, you live at ${HOME_ADDRESS}. It is now ${TIME}
$ perl -i convert.pl inputfile.txt
$ cat inputfile.txt
Hello ${userName}, you live at ${homeAddress}. It is now ${time}

نصائح أخرى

مهيأ من أجل الوضوح:

sed -i '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g 
                   s/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g 
                   s/\$\{TIME\}/\$\{time\}/g
                  }'

حيث /^Hello/ يحدد الخطوط التي ترغب في العمل على (جعلها أكثر تحديدا إذا لزم الأمر) والباقي بدائل لكل متغير اسم.


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

الجواب أعلاه يعمل بشكل جيد حقا.للتأكد من اكتمالها ، وأود أن أضيف أن يمكنك القيام به:

sed '/^Hello/ { s/\$\{USER_NAME\}/\$\{userName\}/g' <filename> \
   | sed 's/\$\{HOME_ADDRESS\}/\$\{homeAddress\}/g' \
   | sed 's/\$\{TIME\}/\$\{time\}/g'

إنهم متطابقة وظيفيا (إلا أن لي مقالب إلى المعياري;سيكون لديك لوضعها في مكان ما (ولكن يمكنك الحصول على إبقاء الأصلي في حالة مثل e, كنت لخبط بانتظام على regexps).أنا أحب بلدي صياغة فقط لأنه لا يمكن أن تبدأ مع واحد sed الأمر, ثم يضاف على المزيد مع

!! | sed 'yet-enother-regexp'

مفاتيح الأسهم ؟ سادسا-وضع ؟ من يحتاج هذه الأشياء ؟ :)

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