في برنامج bash النصي، كيف أقوم بتطهير مدخلات المستخدم؟

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

سؤال

أنا أبحث عن أفضل طريقة لأخذ مدخلات بسيطة:

echo -n "Enter a string here: "
read -e STRING

وقم بتنظيفه عن طريق إزالة الأحرف غير الأبجدية الرقمية، وحالة الأحرف الصغيرة، واستبدال المسافات بشرطات سفلية.

هل النظام مهم؟يكون tr الطريقة الأفضل/الوحيدة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

كما يشير dj_segfault، يمكن لـ Shell القيام بمعظم هذا نيابةً عنك.يبدو أنه سيتعين عليك الرجوع إلى شيء خارجي لتصغير السلسلة.لهذا لديك العديد من الخيارات، مثل Perl المذكورة أعلاه، وما إلى ذلك، ولكن أعتقد أن tr ربما يكون الأبسط.

# first, strip underscores
CLEAN=${STRING//_/}
# next, replace spaces with underscores
CLEAN=${CLEAN// /_}
# now, clean out anything that's not alphanumeric or an underscore
CLEAN=${CLEAN//[^a-zA-Z0-9_]/}
# finally, lowercase with TR
CLEAN=`echo -n $CLEAN | tr A-Z a-z`

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

نصائح أخرى

يستطيع باش القيام بكل هذا بمفرده، شكرًا جزيلاً لك.إذا نظرت إلى قسم صفحة الرجل على توسيع المعلمة, ، سترى أن هذا bash يحتوي على بدائل مضمنة، وسلسلة فرعية، وتقليم، وrtrim، وما إلى ذلك.

لإزالة كافة الأحرف غير الأبجدية الرقمية، قم بذلك

CLEANSTRING=${STRING//[^a-zA-Z0-9]/}

هذا الحلاقة أوكام.لا حاجة لبدء عملية أخرى.

سريع و قذر:

STRING=`echo 'dit /ZOU/ een test123' | perl -pe's/ //g;tr/[A-Z]/[a-z]/;s/[^a-zA-Z0-9]//g'`

يمكنك تشغيله من خلال بيرل.

export CLEANSTRING=$(perl -e 'print join( q//, map { s/\\s+/_/g; lc } split /[^\\s\\w]+/, \$ENV{STRING} )')

أنا أستخدم قذيفة فرعية بنمط ksh هنا، ولست متأكدًا تمامًا من أنها تعمل في bash.

هذا هو الشيء الجميل في Shell، هو أنه يمكنك استخدام Perl، awk، sed، grep ....

بعد قليل من النظر حولها يبدو tr هي في الواقع أبسط طريقة:

export CLEANSTRING="`echo -n "${STRING}" | tr -cd '[:alnum:] [:space:]' | tr '[:space:]' '-'  | tr '[:upper:]' '[:lower:]'`"

الحلاقة أوكام, ، أفترض.

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