使用sed或awk从字段中删除斜杠

时间:2013-01-23 16:15:52

标签: bash scripting sed awk

我正在尝试删除任何|之间的任何斜杠介于\ \之间,包括名称'

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

期望的输出

10.46|5060|100002366551140|WAPNER M |100002366551750

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

4 个答案:

答案 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