2009-07-27 39 views
20

Tôi đang tìm tập lệnh bash hoặc sed (tốt nhất là một lớp lót) mà tôi có thể chèn ký tự dòng mới sau một số ký tự cố định trong tệp văn bản lớn.Cách chèn ký tự dòng mới sau một số ký tự cố định trong một tệp

+0

Ngắt của http://stackoverflow.com/questions/525592/find-and-replace-inside-a-text-file-from-a-bash-command trong số rất nhiều, rất nhiều người khác –

+4

Tôi không đồng ý với nhận xét hai mặt ở đây, Neil: đây không phải là tìm kiếm đơn giản và thay thế như câu hỏi trong liên kết của bạn .. – Kristian

Trả lời

32

Làm thế nào về một cái gì đó như thế này? Thay đổi 20 là số ký tự trước khi xuống dòng, và temp.text là file để thay thế trong ..

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

Không nếu tệp có ký tự '~' –

+1

Điều này chèn một dòng mới sau * mỗi * 20 ký tự (trên mỗi dòng của bản gốc). Nếu bản gốc không chứa dòng mới và bạn muốn một dòng mới chỉ sau 20 ký tự đầu tiên, hãy bỏ "g" (toàn cục) ở cuối. Nếu bạn muốn điều này và bản gốc chứa các dòng mới, bạn sẽ phải sử dụng một giải pháp khác. –

+0

Tôi đã có cùng một vấn đề nhưng trong OSX nó chèn một "n" chứ không phải là một ngắt dòng? Tôi đã kiểm tra các bài đăng khác có cùng vấn đề nhưng tôi không thể hiểu cách khắc phục? Có ai không? – JM88

0

nếu bạn có nghĩa là bạn muốn chèn xuống dòng của bạn sau khi một số nhân vật liên quan đến toàn bộ tập tin , ví dụ như sau khi nhân vật thứ 30 trong toàn bộ tập tin

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

nếu bạn có nghĩa là chèn ở vị trí thứ cụ thể của nhân vật trong mỗi dòng ví dụ sau mỗi nhân vật thứ 5

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

Nối một empt y dòng sau một dòng với chính xác 42 ký tự

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

Cho N là biến trình bày đại diện cho số ký tự mà bạn muốn một dòng mới. Nếu bạn muốn tiếp tục đếm các dòng đếm:

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

Nếu bạn muốn khởi động lại số đếm cho mỗi dòng, hãy bỏ qua đối số -0xff.

0

Điều này có thể làm việc cho bạn:

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

nghĩa đen chỉ hoạt động cho dòng đầu tiên (ví dụ: chèn dòng mới sau 20 ký tự và sau đó thoát). Không thích hợp cho "tệp văn bản lớn". – michael

26

Đây là giải pháp POSIX:

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

Hoặc:

fold -w5 file 

Input:

banana strawberry grape 

Đầu ra:

banan 
a str 
awber 
ry gr 
ape 

Điều thú vị là giải pháp Awk hiệu quả hơn gấp.

+2

Tôi đã nhìn thấy điều này đã thử hàng chục cách khác nhau, nhưng luôn luôn có trường hợp đặc biệt, sự khác biệt phiên bản, các vấn đề khác, hoặc giải pháp chỉ là không đồng đều. 'fold' là * chắc chắn * công cụ thích hợp cho việc này. +1 – laindir

+1

'fold' phải là câu trả lời đúng. 'man fold' cho' quấn từng dòng đầu vào để vừa với chiều rộng được chỉ định'. Nó trả lời câu hỏi một cách hoàn hảo! – dcousens

+0

tiếc là 'fold' không xử lý bất kỳ thứ gì ngoài các tệp ascii đơn giản - chỉ cần thử kiểm tra trên bất kỳ tệp unicode nào (ví dụ: với dấu ngoặc đơn đặc biệt, v.v.), nó tạo ra nhiều thứ. Tuy nhiên, 'awk..gsub' không hoạt động. – michael

Các vấn đề liên quan