1

我正在尝试删除任何 | 之间的任何斜杠 之间的 \ \ 其中包括一个名字'

10.46|5060|100002366551140|\WAPNER| M\ |100002366551750

期望的输出

10.46|5060|100002366551140|WAPNER M |100002366551750

在使用 sed 或 awk 时,非常感谢您的帮助:)

4

4 回答 4

2
$ cat file
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750

$ sed 's/\\\([^\\]*\)|\([^\\]*\)\\/\1\2/' file
10.46|5060|100002366551140|WAPNER M |100002366551750

如果您不想删除“\”,只需将它们移到括号内即可。

于 2013-01-23T16:32:06.800 回答
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
于 2013-02-27T16:00:24.953 回答
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 之间有任何|符号\

    • 抓住\'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
于 2013-01-23T16:39:21.170 回答
0

试试这个

sed -re 's/\\(\w+)(\|)([ A-Za-z]+)\\/\1 \3/g' temp.txt

输出

10.46|5060|100002366551140|WAPNER M |100002366551750

于 2013-01-24T05:29:22.380 回答