如何将ls -1的结果加入到一行中,并用我想要的任何内容将其分隔?
当前回答
如果你的xargs版本支持-d标志,那么这应该可以工作
ls | xargs -d, -L 1 echo
-d是分隔符标志
如果没有-d,那么可以尝试以下操作
ls | xargs -I {} echo {}, | xargs echo
第一个xargs允许您指定分隔符,在本例中为逗号。
其他回答
为了避免tr的换行符混淆,我们可以在ls中添加-b标志:
ls -1b | tr '\n' ';'
设置IFS和使用“$*”的组合可以实现您想要的功能。我使用了一个subshell,所以我不会干扰这个shell的$IFS
(set -- *; IFS=,; echo "$*")
为了捕获输出,
output=$(set -- *; IFS=,; echo "$*")
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
快速Perl版本与尾随斜杠处理:
ls -1 | perl -E 'say join ", ", map {chomp; $_} <>'
解释:
perl -E:执行perl的特性支持(例如,…) 说:打印与载体返回 join ", ", ARRAY_HERE:用","加入数组 地图{切齿;$_} ROWS:从每一行中删除载体返回并返回结果 <>: stdin,每一行都是一个ROW,与映射耦合将创建每个ROW的数组
这个命令是为PERL爱好者准备的:
ls -1 | perl -l40pe0
这里的40是空格的八进制ascii码。
-p将逐行处理并打印
-l将负责用我们提供的ASCII字符替换尾随的\n。
-e是通知PERL我们正在执行命令行。
0表示实际上没有命令要执行。
Perl -e0与Perl -e ' '相同