Câu hỏi Cách chèn ký tự dòng mới sau một số ký tự cố định trong một tệp


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


24
2017-07-27 08:34


gốc


Dupe của stackoverflow.com/questions/525592/… trong số rất nhiều người khác
Tôi không đồng ý với lời bình luận ở đây, Neil: đây không phải là một 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


Các câu trả lời:


Còn những thứ như thế này thì sao? Thay đổi 20 là số ký tự trước dòng mới và temp.text là tệp để thay thế trong ..

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

35
2017-07-27 09:15



Không nếu tệp có chứa ký tự '~' - William Pursell
Đ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. - Dennis Williamson
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
@ JM88, Unix / Linux sử dụng ký tự dòng cấp dữ liệu (\n) cho các ngắt dòng. Mac sử dụng ký tự trả về dấu ngắt dòng (\r) và Windows sử dụng kết hợp cả hai (\r\n) cho các ngắt dòng. Thay đổi lệnh thành sed -e "s/.\{20\}/&\r/g" < temp.txtvà bạn sẽ nhận được những gì bạn cần. Xem thêm Stack-O này và blog này về nó. - David
Rất nhiều triển khai sed giới hạn số ký tự đã chọn đến 255. Ưu tiên phản hồi của Steven Penny. - Benoît Sauvère


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

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

Hoặc là:

fold -w5 file

Đầu vào:

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.


29
2018-05-11 23:28



Tôi đã 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
fold nên là câu trả lời đúng. man fold cho wrap each input line to fit in specified width. Nó trả lời câu hỏi một cách hoàn hảo! - dcousens
không may fold không xử lý bất kỳ thứ gì ngoài các tệp ascii đơn giản, thật không may - chỉ cần thử nghiệm 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 một mớ hỗn độn. Các awk..gsub làm việc, tuy nhiên. - michael


Gọi N là biến hệ vỏ đại diện cho số lượng ký tự mà bạn muốn một dòng mới. Nếu bạn muốn tiếp tục đếm số dòng:

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.


2
2017-07-27 10:28





nếu bạn có nghĩa là bạn muốn chèn dòng mới của mình sau một số ký tự đối với toàn bộ tệp, ví dụ: sau ký tự thứ 30 trong toàn bộ tệp

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 muốn chèn vào số ký tự cụ thể trong mỗi dòng, ví dụ sau mỗi ký tự thứ 5

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

0
2017-07-27 09:34





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

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

0
2017-07-27 10:12





Điều này có thể phù hợp với bạn:

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

0
2017-12-11 14:50



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