,
テキストファイルから(カンマ)と(引用符)を削除したい"
(二重引用符にカンマ区切りの数字が含まれている場合のみ)。
56,72,"12,34,54",x,y,"foo,a,b,bar"
期待される出力
56,72,123454,x,y,"foo,a,b,bar"
メモ:上記の行は例としてのみ使用されます。私のテキストファイルには上記のような多くの行が含まれています。二重引用符内のカンマで区切られた数字は異なる必要があります。それは、
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
予想出力:
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"
二重引用符の中には、カンマで区切られた数字がたくさんありますn
。そして、文字を含む二重引用符を保持してください。
私はsed
テキスト処理ツールが大好きです。sed
これに対する解決策を投稿していただければ幸いです。
ベストアンサー1
Perlが大丈夫なら、ここに短い(必ずしも簡単ではありませんが、おそらく高速です:))方法があります:
perl -pe 's:"(\d[\d,]+)":$1=~y/,//dr:eg' file
e
演算子のフラグ(s:::
作成する別の方法s///
)は、置換が毎回評価される式として処理されるようにします。この式は$1
正規表現(すでに引用符がありません)からキャプチャを取得し、すべてのカンマ(y///
、で書くこともできます)を削除()して変換します。 (翻訳数の代わりに)翻訳された文字列の値を取得するには、toフラグを使用する必要があります。tr///
/d
r
y
Perlに汚染されていると感じる人のために、Pythonと同等のものがあります。 Pythonは実際には1行のシェルではありませんが、時には協力するように導くことができます。以下は1行で書くことができますが(for
できないループとは異なり)、水平スクロールを使用すると読み取りが(さらに)難しくなります。
python -c '
import re;
import sys;
r=re.compile("\"(\d+(,\d+)*)\"");
all(not sys.stdout.write(r.sub(lambda m:m.group(1).replace(",",""),l))
for l in sys.stdin)
' < file