새 줄을 찾아서 바꾸는 방법은 무엇입니까?

새 줄을 찾아서 바꾸는 방법은 무엇입니까?

쉼표로 구분된 CSV가 있는데 줄 바꿈으로 구분하고 싶습니다.

입력하다:

a, b, c

산출:

a
b
c

vim이 작업을 수행하는 Java 파서를 작성했지만 이를 수행하기 위해 다른 도구를 사용할 수 없습니까 ?

sed나에게 적합하지 않음:

#!/bin/sh

# Start
cat > infile.csv << __EOF__
a, b, c
__EOF__
cat infile.csv
sed 's/, /\n/g' infile.csv > outfile.csv

cat outfile.csv

답변1

다른 답변이 원하는 것을 달성하는 것처럼 보이며 스크립트 가능한 도구가 가장 적합한 옵션인 것 같습니다.

하지만 vim에 대해 묻는 것이므로 다음과 같이 할 수 있습니다.

%s/, /\r/g

즉, 모든 쉼표 + 공백을 캐리지 리턴으로 바꾸십시오. 그러면 이는 파일에 대한 적절한 줄 끝 문자로 해석됩니다. (검색을 통해 확인하실 수 있습니다 \r. 검색되지 않습니다.)

답변2

~처럼이안의 대답, 다음을 사용할 수도 있습니다 tr.

$ echo a,b,c | tr ',' '\n'
a
b
c

두 답변 모두 CSV가 단순하다고 가정합니다(즉, 모든 쉼표는 필드 구분 기호입니다). a,"b,c",d"단일 필드가 어디에 있습니까?"와 같은 질문이 있으면 b,c상황이 더 어려워집니다.

답변3

\nPOSIX는 sed의 대체 텍스트에 사용을 허용하지만 강제하지는 않습니다 . GNU sed가 이를 수행할 수 있지만 문자 그대로 출력하는 s구현도 있습니다 .\n

POSIX 호환 awk를 사용할 수 있습니다. 입력 필드 구분 기호를 FS정규식으로 설정하고 출력 필드 구분 기호를 ORS문자열(일반적인 백슬래시 이스케이프 사용)로 설정합니다. $1=$다른 필드 구분 기호를 사용하도록 행을 다시 작성하려면 할당이 필요합니다 .

awk -vFS=', *' -vOFS='\n' '{$1=$1; print}'

(입력 내용에 따옴표 없이 일반 쉼표와 공백으로 구분된 값이 포함되어 있다고 가정합니다. 따옴표가 있는 경우 Perl 또는 Python과 같은 언어로 실제 CSV 파서를 사용해야 합니다.)

답변4

사용행복하다(이전 Perl_6)

perl6 -pe 's:g/ "," \s /\n/;' 

#OR

perl6 -ne '.split(", ").join("\n").put;'  

또한 삽입된 개행 문자, 따옴표 안의 쉼표 등이 걱정된다면 Raku Text::CSV모듈을 사용하세요.

raku -MText::CSV -e '.join("\n").put for csv(in => lines, sep => ", ");'

입력 예:

a, b, c

출력 예(위의 모든 코드):

a
b
c

https://unix.stackexchange.com/a/701805/227738
https://raku.org

관련 정보