Python或vbscript可以使用,但它們過於簡單。嘗試sed
:
$ sed -E 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file
Jordan | Michael | 23 | Bulls | Chicago
Bryant | Kobe | 8 || LA
要保存到一個新文件:
sed -E 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file >newfile
或者,改變就地現有文件:
sed -Ei.bak 's/(Jordan *)\|/\1/g; s/(Kobe *)\| *\|/\1/g' file
它是如何工作
的sed逐行讀取和處理文件。在我們的例子中,我們只需要具有s/old/new/g
格式的替換命令,其中old
是一個正則表達式,如果找到它,則替換爲new
。命令結尾的可選g
告訴sed執行替換命令「全局」,這意味着不僅僅是一次,而是多次出現在行上。
s/(Jordan *)\|/\1/g
這告訴sed尋找喬丹後跟零個或多個空格,然後豎線和刪除豎線。
更詳細地說,(Jordan *)
中的parens告訴sed保存字符串Jordan,後跟零個或多個空格作爲一個組。在替換方面,我們將該組引用爲\1
。
s/(Kobe *)\| *\|/\1/g
同樣,這告訴sed找科比後跟零個或多個空格,然後豎線和刪除豎線。
使用Python
使用與上述相同的邏輯,這裏是一個Python程序:
$ cat kobe.py
import re
with open('file') as f:
for line in f:
line = re.sub(r'(Jordan *)\|', r'\1', line)
line = re.sub(r'(Kobe *)\| *\|', r'\1', line)
print(line.rstrip('\n'))
$ python kobe.py
Jordan | Michael | 23 | Bulls | Chicago
Bryant | Kobe | 8 || LA
要的是保存到一個新的文件:
python kobe.py >newfile
爲什麼8之後仍然有兩個'|'? –
嗨。在上面的例子中,每行總是應該有四個垂直條來分隔每個字段。有些情況下字段可以是空白的,就像上面的例子。 –