如何将ls -1的结果加入到一行中,并用我想要的任何内容将其分隔?
当前回答
就bash
mystring=$(printf "%s|" *)
echo ${mystring%|}
其他回答
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是多余的。
下面是另一个使用内置join函数的perl答案,它不留下尾随分隔符:
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
晦涩的-0777使perl在运行程序之前读取所有输入。
不留下尾随分隔符的Sed替代方法
ls | sed '$!s/$/,/' | tr -d '\n'
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
解释:
-e -表示要执行的命令 :a -为标签 /$/N -定义当前和(N)下一行的匹配范围 s / \ n / \ \ n /;-将所有EOL替换为\n 助教;-如果匹配成功,则标记a
摘自我的博客。
设置IFS和使用“$*”的组合可以实现您想要的功能。我使用了一个subshell,所以我不会干扰这个shell的$IFS
(set -- *; IFS=,; echo "$*")
为了捕获输出,
output=$(set -- *; IFS=,; echo "$*")
不要白费力气。
ls -m
它就是这么做的。