Unix 在最后一个给定字符后将行拆分为多行

Unix 在最后一个给定字符后将行拆分为多行,unix,text,sed,fold,Unix,Text,Sed,Fold,我在unix中有一个由多个长行组成的文本文件 ALTER Tit como(titel('42423432;434235111;757567562;2354679;5543534;6547673;32322332;54545453')) ALTER Mit como(Alt('432322;434434211;754324237562;2354679;5543534;6547673;32322332;54545453')) 我需要将每行拆分为不超过42个字符的多行。 拆分应在最后一个“;”末尾

我在unix中有一个由多个长行组成的文本文件

ALTER Tit como(titel('42423432;434235111;757567562;2354679;5543534;6547673;32322332;54545453'))
ALTER Mit como(Alt('432322;434434211;754324237562;2354679;5543534;6547673;32322332;54545453'))
我需要将每行拆分为不超过42个字符的多行。 拆分应在最后一个“;”末尾完成,并且 因此,我理想的输出文件是:

ALTER Tit como(titel('42423432;434235111; -

757567562;2354679;5543534;6547673; -

32322332;54545453'))

ALTER Mit como(Alt('432322;434434211; -

754324237562;2354679;5543534;6547673; -

32322332;54545453'))
我使用了fold-w42 givenfile.txt | sed's/$/-/g'

它拆分行,但不在行尾添加“-”,也不在“;”之后拆分。 非常感谢您的帮助。 谢谢

工作原理 Awk隐式地循环其输入的每一行,每一行被划分为字段。此代码使用单个变量
w
跟踪输出行的当前宽度

  • -F';'

    告诉awk以分号分隔字段

  • `w{print”“}

    如果最后一行未完成,
    w>0
    ,则在开始新行之前,打印一个新行以终止它

  • w=长度($1);printf“%s”,1美元

    打印新行的第一个字段,并根据其长度设置
    w

  • 在其余字段上循环:

    for (i=2;i<=NF;i++){
        if ((w+length($i)+1)<42){
            w+=length($i)+1
            printf";%s",$i
        } else {
            w=length($i)
            printf"; -\n%s",$i
        }
    }
    
    for(i=2;i这可能适合您(GNU-sed):

    这将全局替换1到41个字符,后跟一个
    ,或1到42个字符,后跟行尾,后跟
    -\n
    。最后一个字符串将有三个字符过多,因此它们将被删除

    ALTER Tit como(titel('42423432;434235111; -
    757567562;2354679;5543534;6547673; -
    32322332;54545453'))
    ALTER Mit como(Alt('432322;434434211; -
    754324237562;2354679;5543534;6547673; -
    32322332;54545453'))
    
    for (i=2;i<=NF;i++){
        if ((w+length($i)+1)<42){
            w+=length($i)+1
            printf";%s",$i
        } else {
            w=length($i)
            printf"; -\n%s",$i
        }
    }
    
    sed -r 's/.{1,42}$|.{1,41};/& -\n/g;s/...$//' file