一重引用符内のカンマのみを削除してください。

一重引用符内のカンマのみを削除してください。

複数行のLinuxシステムには、次の入力ファイルがあります。

123, 'John, Nesh', 731, 'ABC, DEV, 23', 6, 400 'Text'
123, 'John, Brown', 140, 'ABC, DEV, 23', 6, 500 'Some other, Text'
123, 'John, Amazing', 1, 'ABC, DEV, 23', 8, 700 'Another, example, Text'

など。,一重引用符フィールドの内容を削除したいです。予想出力:

 123, 'John Nesh', 731, 'ABC DEV 23', 6, 400 'Text'
 123, 'John Brown', 140, 'ABC DEV, 23', 6, 500 'Some other Text'
123, 'John Amazing', 1, 'ABC DEV, 23', 8, 700 'Another example, Text'

答え1

dsvbash 5.2には、「区切り文字で区切られた」値を解析するための新しいロード可能モジュールがあります。

$ echo $BASH_VERSION
5.2.0(2)-release
$ cat input.csv
'123','ABC, DEV 23','345','534.202','NAME'
$ enable dsv
$ dsv -S -p -a fields "$(head -1 input.csv)"
$ declare -p fields
declare -a fields=([0]="'123'" [1]="'ABC, DEV 23'" [2]="'345'" [3]="'534.202'" [4]="'NAME'")
$ fields=( "${fields[@]//,/}" )     # remove commas from all elements
$ (IFS=,; echo "${fields[*]}")
'123','ABC DEV 23','345','534.202','NAME'

コマンドのヘルプテキストdsv:

dsv:dsv [-a ARRAYNAME] [-d DELIMS] [-Sgp]文字列

STRINGで区切り文字で区切られたフィールドを読み取ります。

STRING(区切り文字で区切られた値の行)を個々のフィールドに解析し、それをインデックス0から始まるインデックス配列ARRAYNAMEに格納します。解析では、二重引用符で囲まれた文字列を理解してスキップします。 ARRAYNAME が指定されていない場合、「DSV」はデフォルトのアレイ名です。区切り文字がコンマ(デフォルト)の場合、カンマで区切られた値はRFC 4180で指定されているとおりに解析されます。

-d オプションは区切り文字を指定します。区切り文字は、DELIMSパラメーターの最初の文字です。複数の文字を含むDELIMSパラメータの指定はサポートされておらず、予期しない結果が発生する可能性があります。 -Sオプションを使用すると、シェルなどの引用が可能です。二重引用符で囲まれた文字列には特殊文字の前にバックスラッシュを含めることができ、一重引用符で囲まれた文字列はシェルで処理するのと同じ方法で処理されます。 -g オプションを使用すると、複雑な分割が可能です。つまり、STRINGの開始と終了で区切り文字シーケンスをスキップし、STRINGの連続区切りインスタンスが空のフィールドを生成しません。 -pオプションが指定されている場合、dsvは生成されたフィールドの一部として引用符文字を保持します。それ以外の場合は削除されます。

無効なオプションが指定されているか、ARRAYNAMEパラメーターが無効であるか、読み取り専用でない限り、戻り値は0です。

答え2

そしてperl

perl -pe "s{'.*?'}{\$& =~ s/,//gr}ge" < your-file

'引用符付き文字列は複数行にまたがらず、引用符付き文字列にエスケープされたsがないと仮定します'...'(ただし、csvで一般的なようにエスケープするとまだ機能します'')。

関連情報