Text-Processing

僅刪除單引號中的逗號

  • October 26, 2022

我在 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'

bash 5.2 有一個新的可載入模組dsv,用於解析“分隔符分隔”的值:

$ 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 選項啟用類似 shell 的引用:雙引號字元串可以在特殊字元之前包含反斜杠,並且反斜杠將被刪除;和單引號字元串按照 shell 處理它們的方式處理。-g 選項啟用貪婪拆分:在 STRING 的開頭和結尾跳過分隔符序列,並且 STRING 中分隔符的連續實例不會生成空欄位。如果提供了 -p 選項,則 dsv 將引號字元作為生成欄位的一部分;否則它們將被刪除。 > > > 除非提供了無效選項或 ARRAYNAME 參數無效或只讀,否則返回值為 0。 > > >

引用自:https://unix.stackexchange.com/questions/722521