web-dev-qa-db-ja.com

ファイル内の固定数の文字の後に改行文字を挿入する方法

巨大なテキストファイルの一定数の文字の後に改行文字を挿入できるbashまたはsedスクリプト(できればワンライナー)を探しています。

28
rangalo

このようなものはどうですか? Change 20は改行の前の文字数で、temp.textは置換するファイルです。

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

POSIXソリューションは次のとおりです。

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

または:

fold -w5 file

入力:

banana strawberry grape

出力:

banan
a str
awber
ry gr
ape

興味深いことに、Awkソリューションはフォールドよりもパフォーマンスに優れています。

36
Steven Penny

Nを、改行が必要になる文字数を表すシェル変数とします。行をまたいでカウントを継続する場合:

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

各行のカウントを再開する場合は、-0xff引数を省略します。

2
William Pursell

(評判を下げるために)直接コメントすることはできないため、上位のコメントに対する新しいヒントがあります。

sedコマンド(まさに私が望むもの)を好み、Posix-Command foldもテストしました。しかし、元の問題の両方のコマンドには少し違いがあります:n * bytesレコード(改行文字なし)のフラットファイルがあり、sedコマンド(number as bytes(20 @Kristianの答えで))wcでカウントするとn行になります。 foldコマンドを使用すると、wc!でn-1行しか取得できません。入力ファイルに改行文字が含まれていない場合、sedで最後の行の後に改行があり、foldで誰もいない場合、この違いは知っておくことが重要です。

1
gmu

正確に42文字の行の後に空行を追加します

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

ファイル全体に関して、文字数の後に、たとえばファイル全体の30番目の文字の後に改行を挿入したい場合

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

各行に特定の数の文字を挿入する場合(5文字ごとなど)

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

これはあなたのために働くかもしれません:

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