2009-07-27 9 views
20

Poszukuję skryptu bash lub sed (najlepiej jednolinijkowego), za pomocą którego mogę wstawić znak nowego wiersza po ustalonej liczbie znaków w ogromnym pliku tekstowym.Jak wstawić znak nowego wiersza po ustalonej liczbie znaków w pliku

+0

Dupek z http://stackoverflow.com/questions/525592/find-and-replace-inside-a-text-file-from--bash-command wśród wielu, wielu innych –

+4

Nie zgadzam się z komentarzem dupe tutaj, Neil: to nie jest proste wyszukiwanie i zamiana, jak pytanie w twoim linku. – Kristian

Odpowiedz

32

Co powiesz na coś takiego? Zmiana 20 jest liczba znaków przed linią, a temp.text jest plik do zastąpienia w ..

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

Przerywa, jeśli plik zawiera znak "~" –

+1

Wprowadza znak nowej linii po * co * 20 znaków (w wierszu oryginału). Jeśli oryginał nie zawiera żadnych znaków nowej linii i chcesz znak nowej linii tylko po pierwszych 20 znakach, pomiń "g" (globalny) na końcu. Jeśli chcesz, a oryginał zawiera znaki nowej linii, musisz użyć innego rozwiązania. –

+0

Miałem ten sam problem, ale w OSX wstawia "n", a nie linię podziału? Sprawdziłem inne posty z tym samym problemem, ale nie mogłem zrozumieć, jak to naprawić? Ktoś proszę? – JM88

0

jeśli oznaczać chcesz wstawić znak nowej linii po określonej liczbie znaków w odniesieniu do całego pliku np po 30 znaków w całym pliku

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

jeśli myśli wstawić na określoną liczbę znaków w każdej linii np po każdym 5th charakteru

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

Dopisz się wykluczałaby y linia po wierszu z dokładnie 42 znakami

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

Niech N będzie zmienną powłoki reprezentującą liczbę znaków, po której ma się pojawić znak nowej linii. Jeśli chcesz kontynuować liczenie według linii:

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

Jeśli chcesz ponownie rozpocząć liczenie dla każdej linii, pomiń argument -0xff.

0

To może pracować dla Ciebie:

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

dosłownie działa tylko dla pierwszej linii (np. Wstawia znak nowej linii po 20 znakach, a następnie kończy działanie). Nie nadaje się do "dużego pliku tekstowego". – michael

26

Oto rozwiązanie POSIX:

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

Lub:

fold -w5 file 

Wejście:

banana strawberry grape 

wyjściowa:

banan 
a str 
awber 
ry gr 
ape 

ciekawe rozwiązanie awk bardziej wydajnych niż krotnie.

+2

Widziałem to wypróbowane dziesiątki różnych sposobów, ale zawsze są specjalne przypadki, różnice wersji, inne problemy, lub rozwiązanie jest po prostu nieeleganckie. 'fold' to * zdecydowanie * odpowiednie narzędzie do tego. +1 – laindir

+1

'fold' powinno być właściwą odpowiedzią. 'man fold' daje' wrap każdej linii wejściowej do dopasowania w określonej szerokości'. Idealnie odpowiada na pytanie! – dcousens

+0

Niestety, 'fold' nie obsługuje niczego innego niż zwykłych plików ascii, niestety - po prostu spróbuj przetestować na dowolnym pliku Unicode (np. Ze specjalnymi cudzysłowami w unikodzie, itp.), Robi bałagan rzeczy. Jednak 'awk..gsub' działa. – michael

Powiązane problemy