web-dev-qa-db-ja.com

シェルはcr \ lfをコンマに置き換えます

Input.txtがあります

1
2
3
4
5

私はそのようなoutput.txtを取得する必要があります

1,2,3,4,5

どうやってするの?

42
vinnitu

これを試して:

tr '\n' ',' < input.txt > output.txt
64
eumiro

sedでは、次を使用できます。

sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'

Hは、パターンスペースをホールドスペースに追加します(ホールドスペースに現在の行を保存します)。 ${...}は、最後の行にのみ適用されるアクションを囲みます。これらのアクションは次のとおりです。xスワップホールドとパターンスペース。 s/\n/,/g埋め込まれた改行をコンマに置き換えます。 s/^,//先頭のコンマを削除します(ホールドスペースの先頭に改行があります)。およびp印刷。 dはパターンスペースを削除します-印刷しません。

したがって、以下を使用することもできます。

sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'

-nはデフォルトの印刷を抑制するため、最後のdは不要になります。

このソリューションでは、CRLF行末がローカルネイティブ行末である(したがって、DOSで作業している)ため、sedが印刷操作でローカルネイティブ行末を生成すると想定しています。 DOS形式の入力はあるが、Unix形式(LFのみ)の出力が必要な場合は、少し努力する必要がありますが、質問で明示的に指定する必要もあります。

MacOS X 10.6.5では、1..5、1..50、1..5000の数字(1行の出力で23,893文字)で問題なく動作しました。私はそれよりももっと強くプッシュしたいかどうかはわかりません。

18

@eumiroの回答に対する@Jonathanのコメントへの応答:

tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
11
glenn jackman

使用されるtrsedは非常に優れていますが、ファイルの解析と正規表現に関しては、Perlに勝るものはありません(なぜsedとtrがPerlよりもShellに近いと考えるのかはわかりません。 )

Perl -pe 's/\n/$1,/' your_file

純粋なシェルでそれを実行したい場合は、文字列の一致を見てください

${string/#substring/replacement}
10
Arnaud

貼り付けコマンドを使用します。パイプを使用しています:

echo "1\n2\n3\n4\n5" | paste -s -d, /dev/stdin

ファイルを使用しています:

echo "1\n2\n3\n4\n5" > /tmp/input.txt
paste -s -d, /tmp/input.txt

Manページごとに、sはすべての行を連結し、dは区切り文字を定義できます。

4
Nestor Urquiza
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"
1
Noel Yap
  • pythonバージョン:

    python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'

末尾のコンマの問題はありません(joinはそのように機能するため)、splitlinesはネイティブの行末でデータを分割します(そしてそれらを削除します)。

1
qneill