لماذا يسبب هذا السيناريو AWK خطأ في بناء جملة؟
سؤال
وفي الأساس، وأنا إنشاء ملف XML عن طريق أخذ القيم من عمود من الجدول. أنا بدأت لhref="http://en.wikipedia.org/wiki/AWK" rel="nofollow AWK النصي من شيل (<لأ href = "HTTP: // en.wikipedia.org/wiki/Korn_shell "يختلط =" noreferrer نوفولو "> KSH إذا كان يهم) مثل هذا:
SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF
${SQLPLUS_SETTINGS}
select customer_id from GD9_GENTH_CUST_SUBSCR;
exit;
EOF`
FILE_LIST=`echo $SQL_RESULT|sed -e 's/\n/''/g'`
echo $FILE_LIST|awk -f awk.file
والسيناريو AWK، awl.file، ويحتوي على:
BEGIN {
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?><GenTransactionHandler xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><EntityToPublish>\n<Entity type=\"C\" typeDesc=\"Customer level\"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_CUST_DATA</TrxName>"
}
{
print "<value>"$1"</value>"
}
END
{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"
}
وعند تشغيل البرنامج النصي انه يعطيني خطأ AWK.
ما هي المشكلة في ذلك؟
المحلول
إذا كنت تحصل على خطأ مشابهة لهذه:
awk: syntax error at source line 9 source file xml.awk
context is
END >>>
<<< {
awk: bailing out at source line 12
وإصلاح التعليمات البرمجية الخاصة بك عن طريق تحريك قوس مفتوح إلى نفس الخط كما END:
END {
...
نصائح أخرى
وهذا السطر:
FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n/''/g'`
ويمكن أن تكون بنفس السهولة:
FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n//g'`
ولكن لا أحد يفعل أي شيء. إذا لديك نية لاستبدال كافة أسطر جديدة مع سلسلة فارغة ثم قيام بذلك:
FILE_LIST=$( echo "$SQL_RESULT" | tr -d "\n" )
وأو مع الفضاء:
FILE_LIST=$( echo "$SQL_RESULT" | tr "\n" " " )
إذا كنت فعلا تريد أن تحل محل كل أسطر جديدة مع زوج من علامات الاقتباس المفردة، وهذا هو قليلا أكثر تعقيدا:
FILE_LIST=$( echo "$SQL_RESULT" | sed -e '1{h};${x;s/\n/'\'\''/g;p};H;d' )
ومنذ كنت تستخدم AWK بالفعل، فإنه ليس من الضروري استخدام أدوات سد أو أخرى مثل آر لتحل محل أسطر جديدة مع NUL.
وOP، قد تكون المشكلة في quoting..but بك هذا مجرد تخمين. اظهار الناتج مزود للحصول على مزيد من التحليل
SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF
${SQLPLUS_SETTINGS}
select customer_id from GD9_GENTH_CUST_SUBSCR;
exit;
EOF` | awk 'BEGIN{
q="\042"
print "<?xml version="q"1.0"q" encoding="q"UTF-8"q"?><GenTransactionHandler xmlns:xsi="q"http://www.w3.org/2001/XMLSchema-instance"q"><EntityToPublish>\n<Entity type="q"C"q" typeDesc="q"Customer level"q"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_CUST_DATA</TrxName>"
}
{
gsub("\n","") # this is the same as your sed command...but also depends on SQL output
print "<value>"$1"</value>"
}
END
{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"
}
}
'