سؤال

لدي العظمي ملف نصي مع النائب السلاسل:

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 في نهاية مصدرها الملف!)

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