我正在尝试删除任何 | 之间的任何斜杠 之间的 \ \ 其中包括一个名字'
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
期望的输出
10.46|5060|100002366551140|WAPNER M |100002366551750
在使用 sed 或 awk 时,非常感谢您的帮助:)
$ cat file
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
$ sed 's/\\\([^\\]*\)|\([^\\]*\)\\/\1\2/' file
10.46|5060|100002366551140|WAPNER M |100002366551750
如果您不想删除“\”,只需将它们移到括号内即可。
如果有多个反斜杠,您可以尝试替代 awk:
awk -F\| '!(NR%2){$1=$1}1' RS=\\ ORS= OFS= file
或者:
awk -F\\ '{for(i=2; i<=NF; i+=2) gsub(/\|/,x,$i)}1' OFS= file
如果您需要处理这样的情况:
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
10.12|\FOO| BAR| BAZ\|12|\X| Y| Z\|14
我不认为你可以用 sed 轻松做到这一点,因为需要迭代地对匹配的正则表达式的部分应用替换。
在 Python 中执行此操作非常简单。doit.py
:
#!/usr/bin/env python2.7
import re
import sys
RE = re.compile(r'\\([^\\]*\|[^\\]*)\\')
for line in sys.stdin.readlines():
matchiter = RE.finditer(line)
while 1:
for match in matchiter:
matching_text = match.group(0)
replacement_text = match.group(1).replace('|', '')
line = line.replace(matching_text, replacement_text)
else:
break
print line,
在伪代码中:
虽然 s 之间有任何|
符号\
:
\
's 之间的部分( match.group(1)
在 Python 中访问),然后去掉
|
里面的 s 。另存为replacement_text
\
's,with
replacement_text
,和loop有用!
$ cat input
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
10.12|\FOO| BAR| BAZ\|12|\X| Y| Z\|14
$ ./doit.py < input
10.46|5060|100002366551140|WAPNER M |100002366551750
10.12|FOO BAR BAZ|12|X Y Z|14
试试这个
sed -re 's/\\(\w+)(\|)([ A-Za-z]+)\\/\1 \3/g' temp.txt
输出
10.46|5060|100002366551140|WAPNER M |100002366551750