次のデータを含む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""]
(.*?
貪欲な一致の場合は、できるだけ早く停止します。]
この場合は初めてです。)
答え2
sed '/"Male/s/"",""/,/1' filename
出力:
"01","5","Male","[""No.**,**kg""]","","",""
"02","6","FeMale","[""No.""]","","",""