shell用逗号替换cr \ lf

时间:2011-01-04 13:50:07

标签: bash shell newline text-processing

我有input.txt

1
2
3
4
5

我需要得到这样的output.txt

1,2,3,4,5

怎么做?

9 个答案:

答案 0 :(得分:63)

试试这个:

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

答案 1 :(得分:16)

使用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个字符)对我有效。我不确定我是否想要更加努力地推动它。

答案 2 :(得分:10)

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

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

答案 3 :(得分:10)

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

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

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

${string/#substring/replacement}

答案 4 :(得分:7)

  • 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的版本(带{ {1}}和wc)删除最后一个逗号:

  • sed

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

答案 5 :(得分:4)

使用粘贴命令。这是使用管道:

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允许定义分隔符。

答案 6 :(得分:1)

cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"

答案 7 :(得分:0)

  • python版本:

    /** * RSA PKCS#1 signature scheme using SHA256 for message hashing. * The actual algorithm id is 1.2.840.113549.1.1.1 * Note: Recommended key size >= 3072 bits. */ @JvmField val RSA_SHA256 = SignatureScheme( 1, "RSA_SHA256", AlgorithmIdentifier(PKCSObjectIdentifiers.sha256WithRSAEncryption, null), listOf(AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, null)), BouncyCastleProvider.PROVIDER_NAME, "RSA", "SHA256WITHRSA", null, 3072, "RSA_SHA256 signature scheme using SHA256 as hash algorithm." )

没有尾随逗号问题(因为python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'以这种方式工作),join在本机行结尾处拆分数据(并删除它们)。

答案 8 :(得分:0)

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

如果要将其输出到文件中,只需

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

如果文件中包含内容,则

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