[英]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.