如何将特定模式之间出现的文件中的行截断为特定长度?

How to truncate the lines to specific length in a file which occurs between specific patterns?

我有一个文件,我必须在其中仅截断模式 @TEST 和 enabled="true"> 之间的行。当匹配时,@TEST 和 enabled="true"> 之间的字符串应该只有 50 个字符。所有其他行应保持不变。

示例 1:

@TEST-TC_234 @TEST My name is Elli,I like to Travel, my hobbies are reading books,cooking,listening to music.I have a dog and the dog is black in colour  enabled="true">

我必须如下所示更改上面的行。

@TEST-TC_234 @TEST My name is Elli,I like to Travel, my hobbies are r enabled="true">

我也有几个句子包含特殊字符需要像上面那样截断

示例

@TEST 05030508227_${mode} @TEST 2 Framed ABCSubData (ABCupdateLoc) with abcdcsmelSubscriptionInfo parameter  populated by tub and ABC DOS data, when ABCDN DOS & xyzabcdeDOS both use  E.164 rule where the Restriction is '4-restrict via ABC DOS'" enabled="true">

我必须如下所示更改上面的行。

awk 救援!

$ awk '{if(match([=10=],/@TEST .*enabled="true">$/))
          {bo=length("@TEST");
           eo=length("enabled=\"true\">"); 
           len=(RLENGTH-bo-eo)>50?50:RLENGTH-bo-eo; 
           print substr([=10=],0,RSTART+bo+len) substr([=10=],length([=10=])-eo)}
       else print}' file

如果匹配,则为 begin/end 模式拆分行;截断中间部分并将它们放回一起。如果没有匹配打印未修改的行。

对于更新的示例,上述脚本产生

@TEST 05030508227_${mode} @TEST 2 Framed ABCSubData (ABCupdateLoc) with abcdcsme enabled="true">