我正在尝试删除任何|之间的任何斜杠介于\ \之间,包括名称'
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
期望的输出
10.46|5060|100002366551140|WAPNER M |100002366551750
使用sed或awk时,非常感谢您的帮助:)
答案 0 :(得分:2)
$ cat file
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
$ sed 's/\\\([^\\]*\)|\([^\\]*\)\\/\1\2/' file
10.46|5060|100002366551140|WAPNER M |100002366551750
如果您不想删除“\”,只需将它们移到括号内。
答案 1 :(得分:1)
替代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
答案 2 :(得分:0)
如果你需要处理这样的案件:
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之间有\
个符号:
\
之间的部分(在Python中作为match.group(1)
访问),并删除
|
在里面。将其另存为replacement_text
\
)替换为
replacement_text
,并循环有效!
$ 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
答案 3 :(得分:0)
试试这个
sed -re 's/\\(\w+)(\|)([ A-Za-z]+)\\/\1 \3/g' temp.txt
输出
10.46|5060|100002366551140|WAPNER M |100002366551750