إزالة شرط الحالة: توسع باش في SED regexp: x = 'a .b' ؛ y = '؛ ؛' sed -n '/$ {x}/،/$ {y}/d'

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

سؤال

أحاول إزالة شرط العلبة من نص باش. سوف يختلف البند ، ولكن سيكون دائمًا ما يكون له خطوط التراجع كجزء من سلسلة مطابقة الحالات.

كنت أحاول 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

هذا يلعب ألعابًا مع اقتباس شل ، لكنه يعمل بشكل جيد. قون

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