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

Split line into multiple lines of 42 Unix after last given char

我有一个由多行长行组成的 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 -w 42 givenfile.txt | sed 's/ $/ -/g'

它拆分行但不在行尾添加“-”并且不在“;”之后拆分。 任何帮助深表感谢。 谢谢!

awk -F';' '
w{
    print""
}

{
    w=length()
    printf "%s",
    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
        }
    }
}

END{
    print""
}
' file

这会产生输出:

ALTER Tit como(titel('42423432;434235111; -
757567562;2354679;5543534;6547673; -
32322332;54545453'))
ALTER Mit como(Alt('432322;434434211; -
754324237562;2354679;5543534;6547673; -
32322332;54545453'))

工作原理

Awk 隐式循环其输入的每一行,并将每一行分为字段。此代码使用单个变量 w 来跟踪输出行的当前宽度。

  • -F';'

    告诉 awk 以分号分隔字段。

  • `w{print""}

    如果最后一行没有完成,w>0,然后在我们开始新行之前打印一个换行符来终止它。

  • w=length(); printf "%s",

    打印新行的第一个字段,并根据其长度设置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
        }
    }
    

    这将循环遍历该行的第二个到最后一个字段。每当我们到达无法在不超过 42 个字符限制的情况下打印另一个字段时,我们打印 ; -\n.

  • END{print""}

    在文件末尾打印一个换行符。

这可能对你有用 (GNU sed):

sed -r 's/.{1,42}$|.{1,41};/& -\n/g;s/...$//' file

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