在最后一个给定的字符后将行拆分为多行 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 个字符。最后一个字符串的三个字符过多,因此将被删除。
我有一个由多行长行组成的 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 个字符。最后一个字符串的三个字符过多,因此将被删除。