ملء النائبة في الملف في مسار واحد
سؤال
لدي العظمي ملف نصي مع النائب السلاسل:
blah blah blah
blah $PLACEHOLDER_1$
blah
$PLACEHOLDER_2$
وهلم جرا.محددة "شكل" النائبة لا يهم -- أنا يمكن تغييرها مهما الأكثر راحة لمدة محددة للتنفيذ.
لدي باش النصي حيث أعلم قيم النائبة وأنا بحاجة إلى إنشاء ملف جديد ، مع النائبة استبدال القيم.
#! /bin/sh
PLACEHOLDER_1 = 'string 1'
PLACEHOLDER_2 = 'multiline
string
2'
# TODO: Generate file output.txt from file output.template
# using placeholders above.
قد فعل هذا في ممرات متعددة مع sed ، ولكنها ليست متعة.أنا لا لا ترغب في استخدام بيرل.أريد أن استخدام textutils و باش نفسها فقط.
ما هي أفضل طريقة أن أفعل ما أريد في مسار واحد?
المحلول
لا يزال يمكنك استخدام sed للقيام محل في تمريرة واحدة.تحتاج فقط إلى تحديد جميع البدائل في أمر واحد.
على سبيل المثال.
sed -i 's/PLACEHOLDER_1/string 1/g;s/PLACEHOLDER_2/string 2/g' <file>
نصائح أخرى
وإليك طريقة القيام بذلك دون sed:
أولا معدلة قليلا ملف القالب الذي النائبة هي باش المتغيرات:
blah blah blah
blah $PLACEHOLDER_1
blah
$PLACEHOLDER_2
و السيناريو:
#! /bin/sh
templatefile=output.template
outputfile=output.txt
PLACEHOLDER_1='string 1'
PLACEHOLDER_2='multiline
string
2'
# DONE: Generate file output.txt from file output.template
# using placeholders above.
echo "$(eval "echo \"$(cat $templatefile)\"")" > $outputfile
هنا هو الإصدار الذي يدل على قالب الواردة في النص ، ولكن مع تطور.وهو يدل أيضا القيم الافتراضية التي يمكن أن تستخدم أيضا في ملف القالب النسخة, بالإضافة إلى أنك يمكن أن تفعل الرياضيات في القالب:
#! /bin/sh
template='blah blah blah
blah $PLACEHOLDER_1
blah
${PLACEHOLDER_2:-"some text"} blah ${PLACEHOLDER_3:-"some
lines
of
text"} and the total is: $((${VAL_1:-0} + ${VAL_2:-0}))'
# default operands to zero (or 1) to prevent errors due to unset variables
outputfile=output.txt
# gears spin, bells ding, values for placeholders are computed
PLACEHOLDER_1='string 1'
PLACEHOLDER_2='multiline
string
2'
VAL_1=2
VAL_2=4
unset PLACEHOLDER_3 # so we can trigger one of the defaults
# Generate file output.txt from variable $template
# using placeholders above.
echo "$(eval "echo \"$template\"")" > $outputfile
لا sed لا حلقات فقط شعر التعشيش و الاقتباس.أنا متأكد كل نقلا عن حمايتك من الاشياء الخبيثة في ملف القالب, ولكن أنا لا أذهب إلى ضمان ذلك.
بناء على الإجابة السابقة ، وربما استخدام صفيف وحساب sed السلسلة ؟
#!/bin/sh
PLACEHOLDER[0]='string 1'
PLACEHOLDER[1]='multiline
string
2'
s="sed -i "
for(( i=0 ; i<${#PLACEHOLDER[*]} ; i++ )) ; do
echo ${PLACEHOLDER[$i]}
s=$s"s/PLACEHOLDER_$i/${PLACEHOLDER[$i]}/g;"
done
echo $s
يبدو أن تفشل على خط متعدد السلاسل ، على الرغم من.
أنا لا أعرف كيف المحمولة باش المصفوفات قد يكون.أعلاه مقتطف اختبار مع "غنو باش النسخة 3.2.17(1)-إطلاق سراح (i386-التفاح-darwin9.0)"
بلدي باش الحل الوحيد:
TEMPLATE='
foo
$var1
bar
$var2'
eval "echo \"$TEMPLATE\""
أنا فقط تعثرت على هذا السؤال لأنني كنت أبحث عن نفس ووجدت envsubst(1)
.
يمكنك استخدام envsubst إذا كنت لا تمانع في استخدام متغيرات البيئة:
PLACEHOLDER_1='string 1' PLACEHOLDER_2='multiline
string
2' envsubst < output.template
إذا كان لديك الكثير من المتغيرات التي يمكنك تخزينها في ملف فقط source
ذلك (تذكر أن استخدام export
في نهاية مصدرها الملف!)