| 間のスラッシュを削除しようとしています。名前を含む \ \ の間'
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
望ましい出力
10.46|5060|100002366551140|WAPNER M |100002366551750
sed または awk を使用している間、あなたの助けは大歓迎です:)
$ cat file
10.46|5060|100002366551140|\WAPNER| M\ |100002366551750
$ sed 's/\\\([^\\]*\)|\([^\\]*\)\\/\1\2/' file
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
これを試して
sed -re 's/\\(\w+)(\|)([ A-Za-z]+)\\/\1 \3/g' temp.txt
出力
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,
擬似コード:
s の間に任意の|
記号がありますが\
:
\
のようにアクセス ) をつかみ、その中のs を取り除きます。名前を付けて保存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