إزالة شرط الحالة: توسع باش في SED regexp: x = 'a .b' ؛ y = '؛ ؛' sed -n '/$ {x}/،/$ {y}/d'
-
26-09-2019 - |
سؤال
أحاول إزالة شرط العلبة من نص باش. سوف يختلف البند ، ولكن سيكون دائمًا ما يكون له خطوط التراجع كجزء من سلسلة مطابقة الحالات.
كنت أحاول SED ولكن يمكنني استخدام AWK أو Perl One-Liner داخل البرنامج النصي Bash.
الهدف من التحرير واضح ومباشر ، يشبه:
$cat t.sh
case N in
a\.b);
#[..etc., varies]
;;
esac
أنا أركض من التوسع المتغير الذي يهرب من الخلف ، فاصميا أو كليهما. إذا كنت "eval" ، فأنا أتجنب هروب عرقلي. إذا لم أفعل ذلك ، فإن شبه الكولون اللحاق بي. لذلك حاولت التوسع الفرعي داخل SED. هذه الأخطاء المترجم كما كتبت. المزيد من الهروب من نصف الكولون لا يبدو أنه يساعد.
X='a\.b' ; Y=';;'
sed -i '/$(echo ${X} | sed -n 's/\\/\\\\/g')/,/$(echo ${Y} | sed -n s/\;/\\;/g')/d t.sh
وهذا:
perl -i.bak -ne 'print unless /${X}/ .. /{$Y}/' t.sh # which empties t.sh
و
eval perl -i.bak -ne \'print unless /${X}/ .. /{$Y}/' t.sh # which does nothing
المحلول
باش printf
لديه ميزة اقتباس من شأنها أن تساعد:
X='a\.b'; Y=';;'
sed "/$(printf "%q" "$X")/,/$(printf "%q" "$Y")/d" t.sh
أو يمكنك استخدام بالإضافة إلى ذلك printf
ميزة المهمة المتغيرة:
printf -v X "%q" 'a\.b'
printf -v Y "%q" ';;'
sed "/$X/,/$Y/d" t.sh
لاحظ استخدام عروض أسعار مزدوجة حول sed
حجة القيادة. اقتباسات واحدة ستمنع توسيع المتغيرات واستبدال القيادة. عندما لا يتم استخدام هؤلاء ، من الأفضل عادة استخدام عروض أسعار واحدة.
نصائح أخرى
X='a\.b'
Y=';;'
perl -i.bak -ne 'print unless /\Q'$X'/ .. /\Q'$Y'/' t.sh
هذا يلعب ألعابًا مع اقتباس شل ، لكنه يعمل بشكل جيد. قون