Unix 在最后一个给定字符后将行拆分为多行
我在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个字符的多行。 拆分应在最后一个“;”末尾
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