2009-10-29 7 views
11

Chcę podzielić plik zawierający odpowiedź HTTP na dwa pliki: jeden zawierający tylko nagłówki HTTP, a drugi zawierający treść wiadomości. W tym celu muszę podzielić plik na dwie części na pierwszej pustej linii (lub na narzędzia UNIX w pierwszym wierszu zawierające tylko znak CR = "\r"), używając skryptu powłoki .Jak podzielić plik na pierwszą pustą linię w sposób przenośny w powłoce (np. Używając sed)?

Jak to zrobić w przenośny sposób (na przykład używając sed, ale bez rozszerzeń GNU)? Można założyć, że pusta linia nie byłaby pierwszym wierszem w pliku. Pusta linia może dostać się do jednego, żadnego lub obu plików; to nie ma znaczenia dla mnie.

Odpowiedz

14
$ cat test.txt 
a 
b 
c 

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

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

Zmiana /^$/ do /^\s*$/ jeśli oczekujesz może być spacje na pustej linii.

+3

Prawdopodobnie powinno to być '/^\ r $ /' (lub na wszelki wypadek '/^\ r? $ /') –

+0

W przypadku użycia/^ \ r? $/Tam też należy użyć -r . – Hubbitus

4

Biorąc skrypt awk

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

awk -f foo.awk < httpfile zapisze się dwa pliki headers i body dla Ciebie.

+0

+1 elegancki (do 15 znaków) –

0

Można wyodrębnić pierwszą część pliku (nagłówki HTTP) z:

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

i drugą część (HTTP ciała) z:

awk '{if(body)print;if($0=="")body=1}' myFile 
15

Można użyć csplit:

echo "a 
b 
c 

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

Lub

csplit -s filename '/^$/' 

(zakładając, że zawartość "filename" jest taka sama jak wynik echa), utworzyłyby w tym przypadku dwa pliki o nazwach "xx00" i "xx01". Prefiks można zmienić z "xx" na "plik wyjściowy", na przykład z -f outfile, a liczbę cyfr w nazwie pliku można zmienić na 3 za pomocą -n 3. Możesz użyć bardziej złożonego wyrażenia regularnego, jeśli chcesz zajmować się zakończeniami linii Macintosh.

Aby podzielić plik po każdej pustej linii, można użyć:

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

Wzór '{*}' powoduje, że poprzedni wzór należy powtórzyć tyle razy, ile to możliwe.

+5

+1 można również użyć go do podzielenia pliku na więcej niż 2 części. –

+0

możesz zrobić to bezpośrednio do tablicy w bashie, zamiast tworzyć pliki? –

+1

@ZacThompson: Edytowałem odpowiedź, aby to stwierdzić, ale dopóki nie zostanie przejrzane: możesz dodać ''{*}'' na końcu powyższego polecenia, aby podzielić wiele razy. na przykład 'csplit nazwa_pliku '/^$ /' '{*}'' – kbeta

Powiązane problemy