如何将ls -1的结果加入到一行中,并用我想要的任何内容将其分隔?
当前回答
如果你的xargs版本支持-d标志,那么这应该可以工作
ls | xargs -d, -L 1 echo
-d是分隔符标志
如果没有-d,那么可以尝试以下操作
ls | xargs -I {} echo {}, | xargs echo
第一个xargs允许您指定分隔符,在本例中为逗号。
其他回答
你可以使用:
ls -1 | perl -pe 's/\n$/some_delimiter/'
这个命令是为PERL爱好者准备的:
ls -1 | perl -l40pe0
这里的40是空格的八进制ascii码。
-p将逐行处理并打印
-l将负责用我们提供的ASCII字符替换尾随的\n。
-e是通知PERL我们正在执行命令行。
0表示实际上没有命令要执行。
Perl -e0与Perl -e ' '相同
Ls有选项-m,用“,”一个逗号和一个空格分隔输出。
ls -m | tr -d ' ' | tr ',' ';'
将此结果输送到tr以删除空格或逗号,这将允许您再次将结果输送到tr以替换分隔符。
在我的例子中,我用分隔符替换分隔符;
取代;使用您喜欢的任意一个字符分隔符,因为tr仅用于作为参数传入的字符串中的第一个字符。
编辑:如果您希望分隔符为逗号,则只需“ls -m”
啊,力量和简单!
ls -1 | tr '\n' ','
把逗号“,”改成任何你想要的。注意,这包括一个“尾随逗号”(用于以换行符结束的列表)。
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