Shell 将 cr\lf 替换为逗号

问题描述 投票:0回答:9

我有输入.txt

1
2
3
4
5

我需要得到这样的输出.txt

1,2,3,4,5

如何做?

bash shell newline text-processing
9个回答
117
投票

试试这个:

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

25
投票

使用

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(单行输出中有 23,893 个字符);我不确定我是否愿意更努力地推动它。


20
投票

回应@Jonathan 对@eumiro 的回答的评论:

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

14
投票

使用

paste
命令。这是使用管道:

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

每个手册页中 s 连接所有行,d 允许定义分隔符。


13
投票

tr
sed
曾经非常好,但是当涉及到文件解析和正则表达式时,你无法击败 perl (不知道为什么人们认为 sed 和 tr 比 perl 更接近 shell...)

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

如果你想要纯 shell 来做,那么看看字符串匹配

${string/#substring/replacement}

12
投票
  • awk 版本:
    • awk '{printf("%s,",$0)}' input.txt
    • awk 'BEGIN{ORS=","} {print $0}' input.txt
    • 输出 -
      1,2,3,4,5,

由于您要求

1,2,3,4,5
,与
1,2,3,4,5,
相比(请注意 5 后面的逗号,上面的大多数解决方案还包括尾随逗号),这里还有两个 Awk 版本(带有
wc
sed
) 去掉最后一个逗号:

  • i='input.txt'; awk -v c=$(wc -l $i | cut -d' ' -f1) '{printf("%s",$0);if(NR<c){printf(",")}}' $i

  • awk '{printf("%s,",$0)}' input.txt | sed 's/,\s*$//'


7
投票
printf "1\n2\n3" | tr '\n' ','

如果你想将其输出到文件中,只需这样做

printf "1\n2\n3" | tr '\n' ',' > myFile

如果您有文件中的内容,请执行

cat myInput.txt | tr '\n' ',' > myOutput.txt

2
投票
  • python版本:

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

没有尾随逗号问题(因为

join
就是这样工作的),并且
splitlines
在本机行尾上分割数据(并删除它们)。


-1
投票
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.