여러 줄이 있는 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
dsv
bash 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에서 일반적인 것처럼 이스케이프하면 여전히 작동합니다 ''
).