用sed替换部分字符串

时间:2015-03-15 11:38:41

标签: replace sed between

我有这个大文件1,000,000+行,其中包括一些内存数据。对于某种用途,我需要将g转换为mb,例如:

DateAndTime#15/03/15 07:57:07
**********************
top - 07:57:27 up 2 days, 15:28, 18 users,  load average: 4.65, 3.15, 2.11
Tasks: 774 total,   2 running, 771 sleeping,   0 stopped,   1 zombie
%Cpu(s): 12.8 us,  2.5 sy,  0.0 ni, 83.5 id,  1.2 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:  16327128 total, 16119192 used,   207936 free,   177868 buffers
KiB Swap: 36060156 total,    78552 used, 35981604 free.  6570548 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 26636 fpd       20   0 9987.4m 6.307g  47728 S   0.0 40.5 192:07.10 AppExe
 29019 fpd       20   0 1752832 785848  45652 S  77.0  4.8  17:32.74 python

为:

 26636 fpd       20   0 9987.4m 6307m  47728 S   0.0 40.5 192:07.10 AppExe

问题是该文件是在一个不舒服的使用结构中构建的,x.xxxG需要先被找到而不是被替换,因此需要花费很多时间(通过readline),其余部分也是如此。文件应该保持不变。

1 个答案:

答案 0 :(得分:1)

以下适用于Linux和OSX / BSD系统:

sed -E 's/(^| )([0-9]).([0-9]{3})g( |$)/\1\2\3m\4/g' infile > outfile 

它做出了某些假设:

  • d.dddg形式的任何字段(其中d是十进制数字)应该被替换(甚至可能在一行上多次出现 - 删除g之后的/ awk 1}}每行最多替换一个
  • 字段以空格分隔

相反,如果需要执行实际计算,{{1}}是您的朋友。