我試圖刪除任何|之間\ \其中包括一個名爲」使用sed或awk從字段中刪除斜槓
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
所需的輸出
10.46|5060|100002366551140|WAPNER M |100002366551750
同時使用awk或者sed,你的幫助是高度讚賞:)
我試圖刪除任何|之間\ \其中包括一個名爲」使用sed或awk從字段中刪除斜槓
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
所需的輸出
10.46|5060|100002366551140|WAPNER M |100002366551750
同時使用awk或者sed,你的幫助是高度讚賞:)
$ cat file
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
$ sed 's/\\\([^\\]*\)|\([^\\]*\)\\/\1\2/' file
10.46|5060|100002366551140|WAPNER M |100002366551750
如果你不想刪除「\」,只需將它們移動到括號內即可。
如果你需要處理的情況是這樣的:
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
完美謝謝,從你身上學到很多東西,謝謝 – Deano
試試這個
sed -re 's/\\(\w+)(\|)([ A-Za-z]+)\\/\1 \3/g' temp.txt
輸出
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
不錯,乾淨!你很聰明! – Deano
您是否知道我如何設法解決相同的問題,如果我在名稱前加入更多斜槓| \ WAPNER |約翰| M \ |得到的輸出是| WAPNER John M | 謝謝 – Deano