我想ls -1
的结果连接成一条线,并与任何我想要的分隔它。
有没有我可以用它来实现这一目标的任何标准的Linux命令?
类似于第一个选项,但省略了尾随分隔符
ls -1 | paste -sd "," -
为了避免潜在的换行符困惑TR我们可以在-b标志添加到LS:
ls -1b | tr '\n' ';'
它看起来像已经存在的答案。
如果你想a, b, c
格式,请使用ls -m
(Tulains Córdova’s answer)
或者,如果你想qazxsw POI格式,使用qazxsw POI(简体a b c
的版本)
或者,如果你想要的任何其他分隔符像ls | xargs
,使用Chris J’s answer(|
的应用程序)
如果您版本的xargs支持-d标志,那么应该工作
ls | paste -sd'|'
-d是分隔符标志
如果没有-d做,那么你可以尝试以下方法
Artem’s answer
第一xargs的允许您指定的分隔符是在这个例子中一个逗号。
ls | xargs -d, -L 1 echo
说明:
ls | xargs -I {} echo {}, | xargs echo
- 表示要执行的命令
sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]
- 是一个标签
-e
- 定义匹配的范围用于当前和(N)分机线
:a
- 替换/$/N
所有EOL
s/\n/\\n/;
- 转到一个标签,如果匹配成功
从\n
服用。
战略经济对话的方式,
ta;
注意:
这是在复杂线性的,毕竟行追加到的sed的模式空间替换一次。
@ AnandRajaseka的my blog,以及其他一些类似的答案,如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
,是O(N²),因为战略经济对话的每一个新行追加到模式空间的时间做替补。
比较,
answer
您可以使用:
here
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 | perl -pe 's/\n$/some_delimiter/'
是多余的。
下面是使用内置ls
功能不留下拖分隔符另一perl的答案:
-1
晦涩join
使perl的运行程序之前阅读所有的输入。
SED替代方案,不留拖定界符
ls | perl -F'\n' -0777 -anE 'say join ",", @F'
添加上majkinetor的回答之上,这里是除去尾随分隔符(因为我不能只是他的答案下评论还)的方式:
-0777
只是删除尽可能多的尾随字节作为您的分隔符计数。
我喜欢这种方法,因为我可以使用多字符分隔符+ ls | sed '$!s/$/,/' | tr -d '\n'
的其他好处:
ls -1 | awk 'ORS=","' | head -c -1
编辑
正如彼得已经注意到,负字节计数不是行头的原生的MacOS版本支持。然而,这可以方便地固定。
首先,安装装配awk
。 “GNU的核心工具是GNU操作系统的基本文件,外壳和文本处理工具。”
ls -1 | awk 'ORS=", "' | head -c -2
还提供的MacOS命令的安装使用前缀“G”。例如coreutils
。
一旦你完成这件事,你可以使用,brew install coreutils
具有负字节计数或更好,使别名:
gls
ghead
有权选择alias head="ghead"
划定的输出与ls
一个逗号和空格。
-m
管道这个结果", "
删除无论是空间或逗号将再次让你管的结果ls -m | tr -d ' ' | tr ',' ';'
更换分隔符。
在我的例子,我替换分隔符tr
分隔符tr
与任何一个字符替换,
分隔符,你更喜欢,因为TR仅占在你作为参数传递的字符串的第一个字符。
您可以使用格格合并在单行多行:
的perl -e“,而(<>){如果(/ \ $ /){终日啃食; }打印;}” bad0>测试
把断线状况如果statement.It可以特殊字符或任何分隔符。
编辑:简单的“ls -m”如果你想你的分隔符是一个逗号
啊,功率和简单!
ls -1 | tr '\n' ','
更改为任何你想要的逗号“”。请注意,这包括“尾随逗号”
快速的Perl版本结尾的斜线处理:
;
解释:
这种替换换行的最后一个逗号:
ls -1 | tr '\n' ',' | sed 's/,$/\n/'
ls -m
包括在屏幕角字符(第80例如)换行。
晴击(仅ls
是外部的):
saveIFS=$IFS; IFS=$'\n'
files=($(ls -1))
IFS=,
list=${files[*]}
IFS=$saveIFS
在击4使用readarray
(又名mapfile
):
readarray -t files < <(ls -1)
saveIFS=$IFS
IFS=,
list=${files[*]}
IFS=$saveIFS
由于gniourf_gniourf您的建议。
我觉得这一个是真棒
ls -1 | awk 'ORS=","'
ORS是“输出记录分隔符”所以现在你的行会用逗号连接。
设置IFS
和使用"$*"
的组合可以做你想做的。我使用的是子shell,所以我不同意这个壳的$ IFS干扰
(set -- *; IFS=,; echo "$*")
捕获输出,
output=$(set -- *; IFS=,; echo "$*")
一般ls
解析is not advised,所以更好的方式是使用find
,例如:
find . -type f -print0 | tr '\0' ','
或使用find
和paste
:
find . -type f | paste -d, -s
对于一般的多行连接(不涉及文件系统),检查:Concise and portable “join” on the Unix command-line。
不要重新发明轮子。
ls -m
它正是这么做的。
刚刚痛击
mystring=$(printf "%s|" *)
echo ${mystring%|}
这个命令是PERL球迷:
ls -1 | perl -l40pe0
这里40是空间的八进制ASCII码。
-p将线和印刷工艺线
-l将采取与我们提供的ASCII字符替换尾随\ n照顾。
-e是通知PERL我们正在做的命令行执行。
0表示实际存在没有要执行的命令。
perl的-e0是相同的perl -e ''