我保存程序输出的日志文件。问题是有时在转储很长的 7 位 ascii 数据行(编码二进制)时会发生错误,我不想保留。在到达换行符之前,这些行的长度可能超过 200KB。
什么可能是一个简短的、可管道的方式,例如。仅更改sed
长度超过 250 个字符的行,方法是仅保留该行的前 80 个和最后 40 个字符,可能只用_?
答案1
在 sed 中,所有命令都可以添加一个条件作为前缀,指示该命令应用于哪些行。一种常见的条件是搜索模式。搜索模式/.\{250\}/
匹配包含超过 250 个字符的行。对于此类行,匹配前 80 个字符和后 40 个字符,并用前缀__
和后缀替换整行。
sed -e '/.\{250\}/ s/^\(.\{80\}\).*\(.\{40\}\)$/\1__\2/'
您甚至可以安排替换命令的模式以仅匹配足够长的行。
sed -e 's/^\(.\{80\}\).\{130,\}\(.\{40\}\)$//'
答案2
我不太了解sed
,所以我的解决方案是 awk:
awk 'length>250{len=length;$0=substr($0,1,80) "_" substr($0,len-40+1)};1' file
答案3
这是一个可以执行此操作的 awk 命令:
awk 'len=length{if(len>250){print substr($0,0,80),"__",substr($0,len-40,len)}else{print $0}}' data.txt
解释:
如果该行长度超过 250 个字符,则打印前 80 个字符,后跟字符串___然后是最后 40 个字符。
如果该行少于 250 个字符,只需打印出原始行。
答案4
有一种可管道化的方法可以使用 提取一行的前 80 个和后 40 个字符sed
,但是sed
没有“if 语句”,因此无法直接在 sed 中测试字符串长度,然后对其执行操作。
捕获前 80 个和后 40 个字符全部线条可以用 来完成| sed -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/'
。
sed -i -e 's/^\(.\{80\}\).*\(.\{40\}\)/\1\_\2/' logfile
将对文件执行就地修改,但仅限于在所有行上操作。