使用sed linux交换列

时间:2017-04-05 13:02:08

标签: regex linux sed text-files

我的任务是使用sed交换文件中的第二和第四列:

Filesystem  Size    Used   Avail   Use% Mounted on
rootfs         583G  380G   203G  66%   /
devtmpfs    1.9G   252K   1.9G   1%     /dev
tmpfs         2.0G    2.5M   1.9G   1%     /dev/shm
/dev/sda1  583G   380G  203G  66%   /

我的sed脚本如下所示:

#!/bin/sed -f
s/\(.*\)\s\+\(.*\)\s\+\(.*\)\s\+\(.*\)\s\+\(.*\)\s\+\(.*\)/\1 \3 \4 \2 \5 \6/g

这不起作用,我无法弄清楚原因。谁能帮帮我吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

$ sed -E 's/^(\S+\s+)(\S+\s+)(\S+\s+)(\S+\s+)/\1\4\3\2/' ip.txt 
Filesystem  Avail   Used   Size    Use% Mounted on
rootfs         203G  380G   583G  66%   /
devtmpfs    1.9G   252K   1.9G   1%     /dev
tmpfs         1.9G   2.5M   2.0G    1%     /dev/shm
/dev/sda1  203G  380G  583G   66%   /
  • -E使用ERE,某些sed版本需要-r选项
  • ^线锚起点
  • (\S+\s+)定义一列 - 非空格字符后跟空格字符
    • 使用它四次获得前四列
    • 然后在替换部分,按照所需的顺序重新安排