角かっこ間のデータを置き換え、他のことを無視します。

角かっこ間のデータを置き換え、他のことを無視します。

次のデータを含むcsvファイルがあります。

入力する

"01","5","Male","[""No.**"",""**kg""]","","",""  
"02","6","FeMale","[""No.""]","","",""

角かっこの間の「、」文字列を置き換えたいのですが、角かっこの外側のデータは変更したくありません。

出力:

"01","5","Male","[""No.**,**kg""]","","",""  
"02","6","FeMale","[""No.""]","","",""

以下のコマンドを試しましたが、角かっこの外側のデータは変わりましたが、すべての行は変わりませんでした。

sed '/\[/,/\]/s/"",""/,/'

ベストアンサー1

sed '/\[/,/\]/s/"",""/,/'

[次に、aのある行を見つけて、aのある行を探し、その]行の間の各行で最初に見つかった行を置き換えます"",""。実際、[..]彼らが連続してどこにいるかに焦点を当てません。


ゼロ次の試みで次のようになります。

$ cat x
"01","5","Male","[""No.**"",""**kg""]","","","" 
$ sed 's/\(\[.*\)"",""\(.*\]\)/\1,\2/g' x
"01","5","Male","[""No.**,**kg""]","","","" 

パターンはa [、everything "",""、everything、およびaと一致し、フラグメントを再結合するためにtheを除く]すべての項目をキャプチャします。"",""

[..],"","",[..]これにより、("",""aが表示される前に角かっこが閉じてパターン検索が続く])や[.."","".."",""..]"",""角かっこ内の複数のシーケンス、1つだけ削除されます)などの問題が発生します。

これはPerlにとってより一般的ですが、私の代替はひどいトリックです。代わりに適切なパーサーを使用する必要があります。

$ cat y
no removal here: [...],"","",[...]
double removal here: [  "",""  "",""  ]
[""remove"",""here""],""not"",""here"",[""also"",""here""]

$ perl -pe 'sub x {$a = shift; $a =~ s/"",""/,/g; return $a;}
     s/(\[.*?\])/ x($1)  /eg  ' y
no removal here: [...],"","",[...]
double removal here: [  ,  ,  ]
[""remove,here""],""not"",""here"",[""also,here""]

.*?貪欲な一致の場合は、できるだけ早く停止します。]この場合は初めてです。)

おすすめ記事