11
votes

Comment scinder le fichier sur la première ligne vide de manière portable dans Shell (par exemple, à l'aide de SED)?

Je veux diviser une réponse HTTP de fichier en deux fichiers: on ne contenant que des en-têtes HTTP et une contaminer le corps d'un message. Pour cela, j'ai besoin de diviser un fichier en deux première ligne vide (ou pour des outils UNIX sur la première ligne contenant uniquement le caractère CR = ' \ r ') en utilisant un script shell .

Comment faire cela sous une 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 dans un fichier. La ligne vide peut être à l'une ou l'autre des fichiers; Peu importe pour moi.


0 commentaires

4 Réponses :


14
votes
$ cat test.txt
a
b
c

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

$ sed '1,/^$/d' test.txt 
d
e
f
Change the /^$/ to /^\s*$/ if you expect there may be whitespace on the blank line.

2 commentaires

Il devrait probablement être / ^ \ r $ / (ou juste au cas où / ^ \ r? $ / )


En cas d'utilisation / ^ \ r? $ / Il doit également être utilisé.



4
votes

étant donné le script AWK xxx

awk -f foo.awk écrivez les deux fichiers en-têtes et et corps pour vous.


0 commentaires

1
votes

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

et la deuxième partie (corps http) avec: xxx


0 commentaires

15
votes

Vous pouvez utiliser csplit : xxx

ou xxx

(supposant le contenu du "nom de fichier" sont identiques que la sortie de l'écho) créerait, dans ce cas, deux fichiers nommés "xx00" et "xx01". Le préfixe peut être changé de "xx" en "Outfile", par exemple, avec -f outfile et le nombre de chiffres dans le nom de fichier pourrait être modifié en 3 avec -n 3 . Vous pouvez utiliser une regex plus complexe si vous devez faire face aux terminaisons de ligne Macintosh.

Pour diviser un fichier à chaque ligne vide, vous pouvez utiliser: xxx p> Le modèle '{*}' provoque la répétition du modèle précédent autant de fois que possible.


5 commentaires

+1 Vous pouvez également l'utiliser pour diviser le fichier en plus de 2 parties.


Pouvez-vous le faire directement à un tableau dans Bash, plutôt que de créer des fichiers?


@Zacthompson: J'ai édité la réponse pour l'énoncer, mais jusqu'à ce qu'il soit révisé: vous pouvez ajouter '{*}' à la fin de la commande ci-dessus pour scinder plusieurs fois. par exemple. nom de fichier CSplit '/ ^ $ /' '{*}'


Cela ne fonctionne pas lorsque la ligne "vide" contient un seul CR (comme spécifié dans la question) - CSplit dit "Match non trouvé"


@Chad: Vous pouvez modifier la spécification au $ '/ ^ \ r $ /'