sedを使用して1行に複数の二重引用符で囲まれた単語の文字を置き換える方法は?

sedを使用して1行に複数の二重引用符で囲まれた単語の文字を置き換える方法は?

このようなテキスト形式を含むテキストファイルがあります。

012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"

sedを使用してパイプ(|)演算子を介して二重引用符内の単語内のコンマのみを置き換える方法。次の出力が必要です。

012345,"[ThinkPadT2/3Gband | Mac]",Lenovo,"iPhone3G|A1241"

答え1

これは標準製作手順です。sed 欲はないそして逆参照括弧内の部分文字列のヒント()

sed 's/\(\"[^",]\{1,\}\),\([^",]\{1,\}\"\)/\1 | \2/g'

またはGNUの場合sed

sed -r 's/("[^",]+),([^",]+")/\1 | \2/g'

答え2

次のように試すことができます。

$ cat filename
012345,"[ThinkPadT2/3Gband,Mac]",Lenovo,"iPhone3G,A1241"

$ cat filename | sed -E 's:([A-Z,a-z]),([A-Z,a-z]):\1|\2:g'
012345,"[ThinkPadT2/3Gband|Mac]",Lenovo,"iPhone3G|A1241"

答え3

Sedはこの目的に適したツールではありません。上記の機能を実装するには、いくつかの高度な機能が必要な場合があると思います。これは、二重引用符内の複数の二重カンマを置き換えるPerlオンラインプログラムです<space>|<space>

$ echo '012345,"[ThinkPadT2/3Gband,Mac,Apple]",Lenovo,"iPhone3G,A1241"' | perl -pe 's/,(?!(?:"[^"]*"|[^"])*$)/ | /g'
012345,"[ThinkPadT2/3Gband | Mac | Apple]",Lenovo,"iPhone3G | A1241"

関連情報