使用 sed 替换部分字符串

replacing part of string using sed

我有这个超过 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),也文件的其余部分应保持不变。

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

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

它做出某些假设:

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

相比之下,如果需要执行实际计算,awk 是你的朋友。