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之后仍然有两个'|'? –
嗨。在上面的例子中,每行总是应该有四个垂直条来分隔每个字段。有些情况下字段可以是空白的,就像上面的例子。 –