سؤال كيف تتطابق مع whitespace في sed؟


كيف يمكنني مطابقة المسافات البيضاء في sed؟ في بياناتي ، أريد مطابقة جميع 3+ أحرف لاحقة بيضاء (مساحة تبويب) واستبدالها بمسافة 2. كيف يمكن القيام بذلك؟


192
2018-02-24 11:53


الأصل




الأجوبة:


فئة الشخصية \s سيطابق حروف المسافات البيضاء <tab> و <space>.

فمثلا:

$ sed -e "s/\s\{3,\}/  /g" inputFile

سيحل كل تسلسل من 3 مسافات بيضاء على الأقل بمسافتين.


ملاحظة: لالتزام POSIX ، استخدم فئة الشخصية [[:space:]] بدلا من \sلأن هذا الأخير هو امتداد لـ GNU sed. انظر مواصفات POSIX لـ ااا و بريس


200
2018-02-24 12:08



آها! كان مفتاح التبديل -e المفقود الذي جعلني. - sequoia mcdowell
واضطررت أيضًا إلى إضافة مفتاح "-r" الذي يُمكّن التعبير المعتاد للتعبير عن الإعتراف بـ "\ s" كمساحة. - HUB
مع أبل sed اضطررت لاستخدام [[:space:]] لان \s لا يعمل بالنسبة لي. ربما \s هو جنو سيد تمديد؟ - Jared Beck
@ JaredBeck الشكر ، كان ينفد من الأفكار لماذا لم يعمل regex بسيطة بلدي المعتاد .. هذا هو عرجاء ، اعتقدت \ s كان معيار regex الموسعة .. أيضا -r لا يعمل و -E فعلت القرفصاء - Karthik T
شكرا على ملاحظاتك. لقد قمت بتحديث الإجابة مع وصلات إلى معيار POSIX. - mrucci


يعمل هذا على MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55
2017-08-28 20:28



هل تعرف ما إذا كان هذا يعمل على جميع توزيعات لينكس؟ - amphibient
ليس بشكل عام ، جنو سيد لن يكون -E. من صفحة رجل BSD sed: "إن -E ، -a و -i خيارات هي ملحقات FreeBSD غير قياسية وقد لا تكون متوفرة على أنظمة التشغيل الأخرى." - Brad Koch
لماذا تحتاج إلى -E flag ، لمشغل +؟ قد تكون معظم التعبيرات على ما يرام مع * بدلاً من ذلك ، ثم يعمل هذا على أنظمة أساسية أخرى. - Samuel
Samuel إذا استخدمت * ، سيطابق التعبير العادي مسافات صفرية أو أكثر ، وستحصل على مسافة بين كل حرف ومساحة عند كل نهاية لكل سطر. إذا لم يكن لديك العلم -E ، فأنت تريد sed "s/[[:space:]]\+/ /g" لمطابقة فراغ واحد أو أكثر. - jbo5112
FWIW ، ويدعم NetBSD ل -E العلم كذلك. - mcandre


قد لا تتعرف بعض الإصدارات الأقدم من sed على \ s كرمز مطابق للمساحة البيضاء. في هذه الحالة ، يمكنك مطابقة سلسلة واحدة أو أكثر من المساحات وعلامات التبويب مع "[XZ] [XZ] *" حيث يمثل X مسافة وعلامة Z هي علامة تبويب.


13
2018-04-07 15:12



إذاً للاحتياجات الخاصة هنا ، مع السيد الأكبر سنا ، يمكنك القيام به: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' inputfile حيث X هي علامة تبويب و Z مساحة. - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8
2017-07-22 14:52



هل هذا مضمون للعمل على أي إصدار من sed على أي نظام؟ إذا لم يكن الأمر كذلك ، فقد يكون من الجدير بالذكر أين يعمل هذا بطريقة مماثلة للإجابات الأخرى ، فقط حتى نعرف القيود وأين لم يكن لهذا النتيجة المقصودة. - Mokubai♦
هذا RE هو ما أستخدمه لمطابقة المسافات البيضاء. إنه أبسط من فئات الأحرف لمطابقة علامة التبويب أو الفضاء فقط. ويستخدم فقط أكثر المواثيق الأساسية للتعبيرات العادية ، لذلك يجب أن يعمل في أي مكان مع التنفيذ الوظيفي للتعبيرات العادية. - Nate
على Mac 10.9.5 ، هذه التطابقات للمسافات و t. لقد استخدمت مايكل دوما أعلاه لتتناسب مع أحرف بيضاء (كما أنها تعمل مع -e). - Alien Life Form
لا يعمل بشكل معقول على نظام SUSE الخاص بي. يتطابق مع أول مكان في السطر حيث توجد مسافات صفرية أو أكثر ، وهو قبل الحرف الأول. أشك في أن هذه هي الوظيفة المقصودة ، وبالتأكيد لم تكن حالة الاستخدام المطلوبة. أعتقد أنك تريد تغيير "*" لـ "\ +" (أو "\ {3 ، \}" لكل سؤال) وربما وضع g في نهاية الأمر sed ليتناسب مع جميع حالات النمط. قد يكون استبدال [\ t] بـ [[: space:]] أيضًا أمرًا مرغوبًا فيه ، في حالة وجود شيء آخر للمسافة البيضاء في السطر. - jbo5112