簡體   English   中英

第一次出現在每一行vi / vim / sed等

[英]First occurrence on every line vi/vim/sed etc

使用VI替換第一個出現/實例非常簡單。

    :%s/search/replace/args

但是,這是我的數據集.csv格式/文件:

"192.168.2.1","www.google.com","2009/01/11_10:00"," What a great website"
"192.168.2.2/driving/is/fun","-","2009/03/22_00:00","Driving website"
"192.168.2.4/boating/is/crazy","-","2009/03/22_00:00","Boating Website"
"192.168.2.5","www.cars.com","2009/04/27_00:00","What a good car website"

所以,你會注意到第一行有4列,這是.csv格式的理想行。

但是,在第二行中,有4列,但第一列只接受ip地址而已,只有192.168.2.2/driving/is/fun必須刪除或用“,”.csv分隔符分隔。

在vi中,我能夠使用以下內容:

    :/^"\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\//s/\//","/

執行以下操作:

  • /^“\\\\\\ {{{{{{{{{{{{{{{{例如,第2行:“192.168.2.2/

  • / s ///“,”/ - 替換IP地址末尾的/並用.csv分隔符替換它“,”

這在VI / VIM中非常有效,一次取代我需要的一行。 但是,數據集要大得多,並且使用以下vi搜索和替換手動操作非常耗時。 我希望編寫腳本或找到替代解決方案,因為VI / VIM一次只能執行一行,以下內容:s / search / replace / g替換每行/更改日期列的行。

顯然,我嘗試過以下方法:

在替換開始時添加整個文件的%,如下所示:

    :/^"\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\//%s/\//","/

它突出顯示我需要修改的每個條目,但錯誤輸出:

    E492: Not an editor command: /^"\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\//%s/\//

這是相當混亂的。

我最終想用sed / perl編寫一次性編輯整個文件的腳本。

所以..

“192.168.2.2/ - >”192.168.2.2“,”

每一行都是第一次出現。

任何幫助將不勝感激..

謝謝!

在vi / vim中,您可以指定要替換的搜索范圍。 在這種情況下,您需要:%s替換所有行:

:%s/search/replace/g

您還可以指定:

:2,5s/search/replace/g      Replace on lines 2-5
:.,$s/search/replace/g      Replace from current line (.) to last line ($)
:.,+3s/search/replace/g     Replace on the current line (.) and the two next lines (+3)
:g/^asd/s/search/replace/g  Replace on lines starting with 'asd'. 

然后,您可以將其與更簡單的模式結合使用,以在整個文件中進行所需的替換:

:%s/^\("[^/"]*\)[^"]*"/\1"/

這將刪除CSV中第一個條目的IP地址后的所有內容。

:%s/^\("[^/"]*\)\/\([^"]*\)"/\1","\2/

這會將第一個條目拆分為IP地址和其余部分,但這只會在IP之后有斜杠的行中完成。 你要做的是找到模式,轉到那條線然后替換。 在這種情況下添加'%'會使命令無效。

在ViM中,嘗試:

 :%s/^\("\d\{,3}\.\d\{,3}\.\d\{,3}\.\d\{,3}\)\(\/[^"]\)/\1","\2

也就是說,我使用全局( %1,$快捷方式1,$從第一行到最后一行 )替換而不是搜索/替換。 我將您的搜索模式移動到替換模式中,並在單獨的組中捕獲IP地址和路徑。 然后將它們更換回來,在它們之間擠壓","

您可以使用更簡單的模式執行您想要的操作:

s/^\("[^/"]*\)[^"]*"/\1"/

這是:匹配行的開始,開始匹配組:匹配" ,匹配任何不是斜杠且不是"任何數量的字符,關閉匹配組,匹配任何數量不是"的字符" ,和匹配" 替換為匹配組內容加上"

腳本的上述模式應該非常簡單。 這是一個Python示例。

#!/usr/bin/env python
import re
import sys

if len(sys.argv) != 3:
    print("Usage: log_file_cleaner <input_file> <output_file>")
    sys.exit(1)

pat = re.compile(r'^("[^/"]*)[^"]*"')

with open(sys.argv[1]) as in_f, open(sys.argv[2], "w") as out_f:
    for line in in_f:
        line = re.sub(pat, r'\1"', line)
        out_f.write(line)

注意:您需要最新版本的Python做一個with做兩open()調用。 如果你堅持在Cygwin,您可以編輯上述兩個嵌套with報表,每一個做一個單一open()調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM