2009-07-27 9 views
20

Je cherche un script bash ou sed (de préférence un one-liner) avec lequel je peux insérer un nouveau caractère de ligne après un nombre fixe de caractères dans un énorme fichier texte.Comment insérer un nouveau caractère de ligne après un nombre fixe de caractères dans un fichier

+0

Dupe de http://stackoverflow.com/questions/525592/find-and-replace-inside-a-text-file-from-a-bash-command parmi beaucoup, beaucoup d'autres –

+4

Je ne suis pas d'accord avec le commentaire de dupe ici, Neil: ce n'est pas une simple recherche et remplacez comme la question dans votre lien .. – Kristian

Répondre

32

Que diriez-vous de quelque chose comme ceci? Changement 20 est le nombre de caractères avant le saut de ligne, et temp.text est le fichier à remplacer dans ..

sed -e "s/.\{20\}/&\n/g" < temp.txt 
+2

Échoue si le fichier contient un caractère '~' –

+1

Cela insère une nouvelle ligne après * tous les * 20 caractères (par ligne de l'original). Si l'original ne contient pas de nouvelle ligne et que vous voulez un retour à la ligne après seulement les 20 premiers caractères, laissez le "g" (global) à la fin. Si vous le souhaitez et que l'original contient des sauts de ligne, vous devrez utiliser une solution différente. –

+0

J'ai eu le même problème mais dans OSX il insère un "n" plutôt qu'un saut de ligne? J'ai vérifié d'autres messages avec le même problème mais je ne pouvais pas comprendre comment le réparer? Quelqu'un s'il vous plait? – JM88

0

si vous voulez dire que vous voulez insérer votre nouvelle ligne après un certain nombre de caractères par rapport au fichier entier , par exemple après le caractère 30 dans le fichier entier

gawk 'BEGIN{ FS=""; ch=30} 
{ 
    for(i=1;i<=NF;i++){ 
     c+=1 
     if (c==ch){ 
      print "" 
      c=0   
     }else{ 
      printf $i 
     } 
    } 
    print "" 
}' file 

si vous voulez dire insérer au nombre spécifique de caractères dans chaque ligne par exemple après chaque 5ème caractère

gawk 'BEGIN{ FS=""; ch=5} 
{ 
    print substr($0,1,ch) "\n" substr($0,ch) 
}' file 
0

Annexer une empt y ligne après une ligne avec exactement 42 caractères

sed -ie '/^.\{42\}$/a\ 
' huge_text_file 
2

Soit N une variable de shell représentant le nombre de caractères après lequel vous voulez un retour à la ligne. Si vous voulez continuer le comptage des lignes de accross:

perl -0xff -pe 's/(.{'$N'})/$1\n/sg' input 

Si vous voulez redémarrer le compteur pour chaque ligne, omettez l'argument -0xff.

0

Cela pourrait fonctionner pour vous:

echo aaaaaaaaaaaaaaaaaaaax | sed 's/./&\n/20' 
aaaaaaaaaaaaaaaaaaaa 
x 
+0

ne fonctionne littéralement que pour la première ligne (par exemple, insère un retour à la ligne après 20 caractères puis se ferme). Ne convient pas pour "un énorme fichier texte". – michael

26

Voici une solution POSIX:

awk '{gsub(/.{5}/,"&\n")}1' file 

Ou:

fold -w5 file 

Entrée:

banana strawberry grape 

sortie:

banan 
a str 
awber 
ry gr 
ape 

Fait intéressant, la solution Awk est plus performant que plier.

+2

J'ai vu cela essayé des dizaines de façons différentes, mais il ya toujours des cas spéciaux, des différences de version, d'autres problèmes, ou la solution est tout simplement inélégante. "fold" est * certainement * le bon outil pour cela. +1 – laindir

+1

'fold' devrait être la bonne réponse. "man fold" donne 'wrap chaque ligne d'entrée pour tenir dans la largeur spécifiée'. Il répond parfaitement à la question! – dcousens

+0

Malheureusement, 'fold 'ne gère pas autre chose que des fichiers ASCEI, malheureusement - essayez simplement de tester sur n'importe quel fichier Unicode (par exemple avec des citations Unicode spéciales, etc), il fait un tas de choses. Le 'awk..gsub' fonctionne cependant. – michael

Questions connexes