如何加入文件名的多行成一个自定义分隔符?

问题描述 投票:374回答:20

我想ls -1的结果连接成一条线,并与任何我想要的分隔它。

有没有我可以用它来实现这一目标的任何标准的Linux命令?

linux bash shell parsing merge
20个回答
598
投票

类似于第一个选项,但省略了尾随分隔符

ls -1 | paste -sd "," -

6
投票

为了避免潜在的换行符困惑TR我们可以在-b标志添加到LS:

ls -1b | tr '\n' ';'

4
投票

它看起来像已经存在的答案。

如果你想a, b, c格式,请使用ls -mTulains Córdova’s answer

或者,如果你想qazxsw POI格式,使用qazxsw POI(简体a b c的版本)

或者,如果你想要的任何其他分隔符像ls | xargs,使用Chris J’s answer|的应用程序)


3
投票

如果您版本的xargs支持-d标志,那么应该工作

ls | paste -sd'|'

-d是分隔符标志

如果没有-d做,那么你可以尝试以下方法

Artem’s answer

第一xargs的允许您指定的分隔符是在这个例子中一个逗号。


3
投票
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服用。


3
投票

战略经济对话的方式,

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

2
投票

您可以使用:

here

2
投票

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'

1
投票

添加上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

0
投票

ghead有权选择alias head="ghead" 划定的输出与ls一个逗号和空格。

-m

管道这个结果", "删除无论是空间或逗号将再次让你管的结果ls -m | tr -d ' ' | tr ',' ';' 更换分隔符。

在我的例子,我替换分隔符tr分隔符tr

与任何一个字符替换,分隔符,你更喜欢,因为TR仅占在你作为参数传递的字符串的第一个字符。


0
投票

您可以使用格格合并在单行多行:

的perl -e“,而(<>){如果(/ \ $ /){终日啃食; }打印;}” bad0>测试

把断线状况如果statement.It可以特殊字符或任何分隔符。


353
投票

编辑:简单的“ls -m”如果你想你的分隔符是一个逗号

啊,功率和简单!

ls -1 | tr '\n' ','

更改为任何你想要的逗号“”。请注意,这包括“尾随逗号”


0
投票

快速的Perl版本结尾的斜线处理:

;

解释:

  • perl的-E:与功能支持执行Perl(比如说,...)
  • 说:与载体返回打印
  • 加入“”,ARRAY_HERE:加入与阵列“”
  • 地图{终日啃食; $ _}行:每行取出载回并返回结果
  • <>:标准输入,每一行是一个ROW,耦合与地图会造成每一行的阵列

24
投票

这种替换换行的最后一个逗号:

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您的建议。


19
投票

我觉得这一个是真棒

ls -1 | awk 'ORS=","'

ORS是“输出记录分隔符”所以现在你的行会用逗号连接。


14
投票

设置IFS和使用"$*"的组合可以做你想做的。我使用的是子shell,所以我不同意这个壳的$ IFS干扰

(set -- *; IFS=,; echo "$*")

捕获输出,

output=$(set -- *; IFS=,; echo "$*")

13
投票

一般ls解析is not advised,所以更好的方式是使用find,例如:

find . -type f -print0 | tr '\0' ','

或使用findpaste

find . -type f | paste -d, -s

对于一般的多行连接(不涉及文件系统),检查:Concise and portable “join” on the Unix command-line


9
投票

不要重新发明轮子。

ls -m

它正是这么做的。


7
投票

刚刚痛击

mystring=$(printf "%s|" *)
echo ${mystring%|}

7
投票

这个命令是PERL球迷:

ls -1 | perl -l40pe0

这里40是空间的八进制ASCII码。

-p将线和印刷工艺线

-l将采取与我们提供的ASCII字符替换尾随\ n照顾。

-e是通知PERL我们正在做的命令行执行。

0表示实际存在没有要执行的命令。

perl的-e0是相同的perl -e ''

© www.soinside.com 2019 - 2024. All rights reserved.