如何将ls -1的结果加入到一行中,并用我想要的任何内容将其分隔?
当前回答
快速Perl版本与尾随斜杠处理:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
解释:
perl -E:执行perl的特性支持(例如,…) 说:打印与载体返回 join ", ", ARRAY_HERE:用","加入数组 地图{切齿;$_} ROWS:从每一行中删除载体返回并返回结果 <>: stdin,每一行都是一个ROW,与映射耦合将创建每个ROW的数组
其他回答
为了避免tr的换行符混淆,我们可以在ls中添加-b标志:
ls -1b | tr '\n' ';'
在majkinetor的回答之上,下面是删除尾随分隔符的方法(因为我还不能在他的回答下评论):
ls -1 | awk 'ORS=","' | head -c -1
只要删除分隔符所需要的尾随字节即可。
我喜欢这种方法,因为我可以使用多字符分隔符+ awk的其他好处:
ls -1 | awk 'ORS=", "' | head -c -2
EDIT
正如Peter所注意到的,head的原生MacOS版本不支持负字节计数。然而,这是很容易解决的。
首先,安装coreutils。GNU核心实用程序是GNU操作系统的基本文件、shell和文本操作实用程序。
brew install coreutils
MacOS提供的命令也以“g”开头安装。例如gls。
一旦你这样做了,你可以使用ghead,它有负字节计数,或者更好,使别名:
alias head="ghead"
Ls有选项-m,用“,”一个逗号和一个空格分隔输出。
ls -m | tr -d ' ' | tr ',' ';'
将此结果输送到tr以删除空格或逗号,这将允许您再次将结果输送到tr以替换分隔符。
在我的例子中,我用分隔符替换分隔符;
取代;使用您喜欢的任意一个字符分隔符,因为tr仅用于作为参数传入的字符串中的第一个字符。
sed方法,
sed -e ':a; N; $!ba; s/\n/,/g'
# :a # label called 'a'
# N # append next line into Pattern Space (see info sed)
# $!ba # if it's the last line ($) do not (!) jump to (b) label :a (a) - break loop
# s/\n/,/g # any substitution you want
注意:
这在复杂度上是线性的,在所有行都附加到sed的模式空间之后只替换一次。
@AnandRajaseka的答案,和其他一些类似的答案,比如这里,是O(n²),因为sed必须做替换每次新行追加到模式空间。
来比较,
seq 1 100000 | sed ':a; N; $!ba; s/\n/,/g' | head -c 80
# linear, in less than 0.1s
seq 1 100000 | sed ':a; /$/N; s/\n/,/; ta' | head -c 80
# quadratic, hung
类似于第一个选项,但省略了后面的分隔符
ls -1 | paste -sd "," -