sed& awk,第二列修改

时间:2013-03-27 15:37:51

标签: bash sed awk

我有一个文件,我需要做一些简单的修改。通常情况下,我不会遇到问题,但是这些列几乎完全相同会让我失望。

一些例子:

net_192.168.0.64_26 192.168.0.64_26  
net_192.168.0.128-26 192.168.0.128-26 

现在,通常在流中我只修改第二列,但是我需要将其写入一个让我感到困惑的文件。

以下字符串完成了我需要它做的事情,但后来我失去了对第一列的可见性,并且无法将它传输到有用的地方:

cat file.txt | awk '{print $2}' | sed 's/1_//g;s/2_//g;s/1-//g;s/2-//g;s/_/\ /g;s/-/\ /g' | egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}'

输出需要看起来像(子网成为第3列):

net_192.168.0.64_26 192.168.0.64 26  
net_192.168.0.128-26 192.168.0.128 26 

如何保持上述行的功能,同时保持两列可见,以便将它们传输到新文件/修改旧文件等。

谢谢!

3 个答案:

答案 0 :(得分:2)

试试这个,如果可以的话:

awk '{gsub(/[_-]/," ",$2)}1' file

使用示例文本进行测试:

kent$  echo "net_192.168.0.64_26 192.168.0.64_26  
net_192.168.0.128-26 192.168.0.128-26"|awk '{gsub(/[_-]/," ",$2)}1'
net_192.168.0.64_26 192.168.0.64 26
net_192.168.0.128-26 192.168.0.128 26

答案 1 :(得分:1)

如果您只想用第二个字段中的单个空格替换字符_-,那么:

$ awk '{gsub(/[-_]/," ",$2)}1' file
net_192.168.0.64_26 192.168.0.64 26
net_192.168.0.128-26 192.168.0.128 26

答案 2 :(得分:1)

sed版本:

sed 's/\(.*\)[-_]/\1 /' file