2017-02-17 70 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地址

相關問題