2013-01-23 73 views
1

我試圖刪除任何|之間\ \其中包括一個名爲」使用sed或awk從字段中刪除斜槓

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

所需的輸出

10.46|5060|100002366551140|WAPNER M |100002366551750 

同時使用awk或者sed,你的幫助是高度讚賞:)

回答

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

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

如果你不想刪除「\」,只需將它們移動到括號內即可。

+0

不錯,乾淨!你很聰明! – Deano

+0

您是否知道我如何設法解決相同的問題,如果我在名稱前加入更多斜槓| \ WAPNER |約翰| M \ |得到的輸出是| WAPNER John M | 謝謝 – Deano

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, 

在僞代碼:

  • 雖然有\秒之間的任何|符號:

    • 抓鬥\的之間的部分(如在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 
+0

完美謝謝,從你身上學到很多東西,謝謝 – Deano

0

試試這個

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

輸出

10.46|5060|100002366551140|WAPNER M |100002366551750

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