Comment diviser le fichier sur la première ligne vide de manière portable en shell (par exemple, en utilisant sed)?

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

Question

Je souhaite scinder un fichier contenant une réponse HTTP en deux fichiers: l'un contenant uniquement des en-têtes HTTP et l'autre contenant le corps d'un message. Pour cela, il est nécessaire de scinder un fichier en deux sur la première ligne vide (ou pour les outils UNIX sur la première ligne contenant uniquement le caractère CR = '\r') à l'aide d'un script shell .

Comment procéder de manière portable (par exemple, en utilisant sed , mais sans extensions GNU)? On peut supposer que la ligne vide ne serait pas la première ligne d'un fichier. Une ligne vide peut contenir un, aucun ou les deux fichiers; cela n’a aucune importance pour moi.

Était-ce utile?

La solution

$ cat test.txt
a
b
c

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

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

Modifiez le /^$/ en /^\s*$/ si vous vous attendez à ce qu'il y ait un espace sur la ligne vierge.

Autres conseils

Vous pouvez utiliser csplit:

echo "a
b
c

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

Ou

csplit -s filename '/^$/'

(en supposant que le contenu de " nomfichier ". soit le même que le résultat de l'écho) créerait, dans ce cas, deux fichiers nommés " xx00 " et " xx01 " ;. Le préfixe peut être changé de & Quot; xx & Quot; " outfile " ;, par exemple, avec -f outfile et le nombre de chiffres du nom du fichier pourrait être remplacé par 3 avec -n 3. Vous pouvez utiliser une expression rationnelle plus complexe si vous devez gérer les fins de ligne Macintosh.

Pour fractionner un fichier à chaque ligne vide, vous pouvez utiliser:

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

Le motif '{*}' entraîne la répétition du motif précédent autant de fois que possible.

Étant donné le script awk

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

awk -f foo.awk < httpfile écrira les deux fichiers headers et body pour vous.

Vous pouvez extraire la première partie de votre fichier (en-têtes HTTP) avec:

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

et la deuxième partie (corps HTTP) avec:

awk '{if(body)print;if($0=="")body=1}' myFile
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top