新しい行を見つけて置き換える方法は?

新しい行を見つけて置き換える方法は?

カンマで区切られた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;'  

また、挿入された改行文字、引用符内のカンマなどが気になる場合は、RakuText::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

関連情報