كيفية تقسيم الملف على أول سطر فارغ في المحمولة في شل (مثلا ، باستخدام sed)?

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

سؤال

أريد أن تقسيم ملف containg استجابة HTTP إلى ملفين:واحدة تحتوي فقط رؤوس HTTP, واحد containg الجسم من رسالة.لهذا أنا بحاجة إلى تقسيم الملف إلى اثنين على أول سطر فارغ (أو أدوات يونكس في أول السطر الذي يحتوي فقط CR = '\r'شخصية) باستخدام شيل.

كيف نفعل هذا في المحمولة الطريقة (على سبيل المثال باستخدام sed, ولكن دون جنو امتداد)?يمكن للمرء أن نفترض أن سطر فارغ لن يكون أول سطر في الملف.سطر فارغ يمكن أن حصلت إما لا شيء أو كل من الملفات ؛ لا يهم بالنسبة لي.

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

المحلول

$ cat test.txt
a
b
c

d
e
f
$ sed '/^$/q' test.txt 
a
b
c

$ sed '1,/^$/d' test.txt 
d
e
f

تغيير /^$/ إلى /^\s*$/ إذا كنت تتوقع قد يكون هناك فاصل على سطر فارغ.

نصائح أخرى

يمكنك استخدام csplit:

echo "a
b
c

d
e
f" | csplit -s - '/^$/'

أو

csplit -s filename '/^$/'

(على افتراض محتويات "اسم الملف" هي نفس الناتج الصدى) ، في هذه الحالة ، ملفين اسمه "xx00" و "xx01".البادئة يمكن تغييرها من "xx" إلى "outfile" ، على سبيل المثال ، -f outfile و عدد من الأرقام في ملف يمكن أن تتغير إلى 3 مع -n 3.يمكنك استخدام أكثر تعقيدا regex إذا كنت بحاجة إلى التعامل مع ماكنتوش خط النهايات.

لتقسيم الملف في كل سطر فارغ يمكنك استخدام:

csplit -s filename '/^$/' '{*}'

نمط '{*}' الأسباب السابقة نمط يتكرر عدة مرات ممكن.

نظرا awk النصي

BEGIN { fout="headers" }
/^$/ { fout="body" }
{ print $0 > fout }

awk -f foo.awk < httpfile كتابة الملفين headers و body بالنسبة لك.

يمكنك استخراج الجزء الأول من الملف الخاص بك (HTTP headers) مع:

awk '{if($0=="")exit;print}' myFile

و الجزء الثاني (HTTP الجسم) مع:

awk '{if(body)print;if($0=="")body=1}' myFile
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top