كيفية استخدام sed لاختبار ثم تحرير سطر واحد من مدخلات ؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

أريد أن اختبار ما إذا كان رقم الهاتف بشكل صحيح ، ومن ثم ترجمته إلى تنسيق مختلف باستخدام البرنامج النصي.هذا ابعد ما يمكن اختبار عدد مثل هذا:

sed -n -e '/(0..)-...\s..../p' -e '/(0..)-...-..../p'

ومع ذلك ، لا ترغب فقط لاختبار عدد والإخراج ، وأود أن إزالة الأقواس ، شرطات و المساحات و الإخراج.

هل هناك أي طريقة للقيام بذلك باستخدام sed ؟ أو يجب أن يكون باستخدام شيء آخر ، مثل AWK?

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

المحلول

وأنا لست متأكدا لماذا كنت تستخدم 0 في هذا الموقف. كنت تقول "صفر تليها أي حرفين" في موقف رمز المنطقة. هل هذا حقا ما تعنيه؟

وعلى أي حال، كنت تريد استخدام الحوار الاقتصادي الاستراتيجي المشغل استبدال مع الأمر p بالتزامن مع التبديل -n. وإليك طريقة واحدة للقيام بذلك:

sed -n 's/(\([0-9][0-9][0-9]\))\s\?\([0-9][0-9][0-9]\)[- ]\([0-9][0-9][0-9][0-9]\)/\1\2\3/p'

نصائح أخرى

ويمكنك أيضا استخدام شيء بسيط مثل egrep للتحقق من صحة الخطوط وtr لإزالة الأحرف التي لا تريد أن ترى:

egrep "\([0-9]+\)[0-9.-]+" <file> |tr -d '()\-'

ملاحظة أنه سوف يعمل فقط إذا كنت لا تريد أن تبقي أي من تلك الأحرف.

هذا هو أكثر إيجازا إصدار جوناثان فاينبيرغ's الإجابة.ويستخدم تمديد التعبيرات العادية لتجنب الاضطرار إلى القيام بكل الهروب من ذلك الأقواس المعقوفة يتطلب (بالإضافة إلى تحريك الهروب من الأقواس من تلك الخاصة إلى حرفية منها).

sed -r 's/\(([[:digit:]]{3})\)\s?([[:digit:]]{3})[ -]([[:digit:]]{4})/\1\2\3/'

وهذا الاقتراح يعتمد على كيف يبدو شكل رقمك مثل، على سبيل المثال، افترض رقم هاتف مثل هذا

echo "(703) 234 5678" | awk '
{
 for(i=1;i<=NF;i++){
    gsub(/\(|\)/,"",$i)    # remove ( and )
    if ($i+0>=0  ){ # check if it more than 0 and a number
        print $i
    }
    if (){
       # some other checks
    }
 }
}
'

وتفعل ذلك بشكل منهجي، ولم يكن لديك لإضاعة الوقت صياغة من التعابير المنطقية المعقدة

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