استخدام sed لإزالة أحرف السطر الجديدة من منتصف الحقل

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

  •  29-10-2019
  •  | 
  •  

سؤال

البيانات التي لدي تبدو مثل هذا

a,b,c,d
a,b1
b2,c,d
A,B,C,D

ما يحدث هو أنه في الحقل 2 يوجد أحيانًا حرف سطر جديد في الحقل الثاني، لذلك يتم تقسيم السطر على سطرين

لقد وجدت حتى الآن نصًا برمجيًا sed يقوم بذلك كما يبدو

cat file| sed ':a;N;$!ba;s/\(\(b1\)\)\n/\1/g'

لكنني أجد صعوبة في الحصول على المجموعات الصحيحة من (.*,) لإنجاز هذا العمل لذا استبدلتها بـ b1 لتشغيل هذا المثال ولكن في العالم الحقيقي A وB وC وD عبارة عن حقول ذات أطوال مختلطة والمحتوى

النتيجة النهائية التي أبحث عنها هي هذه

a,b,c,d
a,b1b2,c,d
A.B,C,D

أي مساعدة هي محل تقدير كبير

شكرا مات

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

المحلول

لدي هنا حل ليس مثاليًا بعد - لكنني سأفكر فيه أكثر.إذا كان الإصدار الخاص بك sed يدعم التعبيرات العادية الموسعة التي يمكنك القيام بها:

cat file | sed -r ':a;N;$!ba;s/((^|\n)([^,]+,){0,2}[^,]+)\n/\1/g'

سيعمل ذلك إذا كان هناك فاصل أسطر في أحد الأعمدة الثلاثة الأولى.حتى الآن لا يعمل بعد مع فواصل الأسطر المتعددة في "السطر".

توضيح:
(^|\n) يطابق بداية السطر (resp.فاصل سطر)
[^,]+, وسائل:مرة على الأقل (+ يعني حرفًا خامًا واحدًا أكثر)!="،" متبوعًا بـ "،"
([^,]+,){0,2} يتطابق إذا كان هناك 0-2 أعمدة محددة بـ "،"
ال [^,]+ يعني أن هناك بعض الأحرف (واحدة على الأقل)!="،" بعد الأعمدة 0-2.
زائدة \n يطابق فاصل الأسطر

لخص s سيطابق الأمر جميع الأسطر التي تحتوي على 0-3 أعمدة مع فاصل أسطر في النهاية وسيستبدله بنفسه (\1) باستثناء فاصل الأسطر الزائدة.

نصائح أخرى

في awk

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