2017-02-17 74 views
0

我有一个文件正在处理中并且卡住的格式如下: “HostRecord”,“SOMEFILE”,“InsideView”,“legacy.name.com”,“1.2.3.4” “1.2.3.5”,“一些评论”,“”删除两个字符串之间的引号

我需要删除“” IP地址之间,但离开,所以最终我将有输出是这样的: “HostRecord “,”SOMEFILE“,”InsideView“,”legacy.name.com“,”1.2.3.4,1.2.3.5“,”一些评论“,”“

我以为我只是使用sed并尝试了多个的东西。我最近的是这样的:

sed -e 's/\(.*[0-9]\{1,3\}=1&\)\"\(,=2&\)\"\([0-9]\{1,3\}=3&\)/\1\2\3/' 

似乎这没有什么效果都没有,在一个特定的工具来完成这项工作没有真正挑剔,我只需要得到它完成。任何人有任何想法?

+0

如果IP始终处于相同的相对位置,为什么不直接访问这些元素并手动删除“?”例如'list [4] = list [4] [: - 1];列表[5] =列表[5] [1:]'。 – PrestonH

+0

因此,我想可能会有所帮助,文件长度约为20万行,并不是所有条目都有多个IP,有些行有几十个IP。我想要做的只是在最后一个字节“,”和下一个IP的第一个八位字节之间进行快速模式匹配,然后将“out”出 – Elmore

+0

因此,如何知道IP的停止时间? –

回答

0

为什么不使用具有真正CSV处理的内容?假设你收集IP地址,直到你得到的东西,不看一个IP地址,这应该工作:

ruby -rcsv -e ' 
    cout = CSV.new $stdout, force_quotes: true 
    CSV.new(ARGF).each do |row| 
    out_row = row.shift(4) 
    ips = row.shift 
    while row[0] =~ /^\d+\.\d+\.\d+\.\d+$/ 
     ips += ",#{row.shift}" 
    end 
    cout << out_row + [ ips ] + row 
    end' infile.csv >outfile.csv 
0

使用替代“s”命令可用的标志,(像普通摹,p或d标志),我们只能取代第N次出现。因此,举例来说:

<file sed 's/"//10' 

将删除第10个双引号 '“'

<file sed -e 's/"//11' -e 's/"//10' 

将删除每一行的第11次报价,然后在10日报价

sed 's|\([0-9]\)","\([0-9]\)|\1,\2|g' 

。这会将存在于","周围的每个单个数字[0-9]保存为两组,然后我们可以将模式替换为第一组\1,然后是co第二组,,接着是第二组\2。我们添加“g”标志,使得替换命令对线上发现的每一个事件都有效。

0

比方说,我们有一个文件test_sed下列行:

"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4","1.2.3.5","some comment","" 
"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4","1.2.3.5","10.10.10.10","192.168.1.12","some comment","" 

使用两个sed命令虽然管道序列(输出重定向):

cat test_sed | sed -re 's#"(([0-9]{1,3}\.){3}[0-9]{1,3})","(([0-9]{1,3}\.){3}[0-9]{1,3})"#"\1,\3"#gp;' 
    | sed -rn 's#,(([0-9]{1,3}\.){3}[0-9]{1,3})","(([0-9]{1,3}\.){3}[0-9]{1,3}),#,\1,\3,#gp;' 

输出:

"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4,1.2.3.5,10.10.10.10,192.168.1.12","some comment","" 
"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4,1.2.3.5,10.10.10.10,192.168.1.12","some comment","" 

([0-9]{1,3}\.){3}[0-9]{1,3})代表IP地址

相关问题