更新sed
到4.4
版本后,sed
不会在find
命令输出中用逗号替换空格,如下所示here-string
:
sed --version
sed (GNU sed) 4.4
ls -l /tmp/test/
total 0
-rw-r--r-- 1 root root 0 Jan 9 17:25 a
-rw-r--r-- 1 root root 0 Jan 9 17:25 b
# NOT EXPECTED
sed "s: :,:g" <<< $(find /tmp/test/ -type f)
/tmp/test/b
/tmp/test/a
sed
4.2没有问题
sed --version
sed (GNU sed) 4.2.2
ls -l /tmp/test/
total 0
-rw-r--r-- 1 root root 0 Jan 9 17:25 a
-rw-r--r-- 1 root root 0 Jan 9 17:25 b
# as expected
sed "s: :,:g" <<< $(find /tmp/test/ -type f)
/tmp/test/a,/tmp/test/b
作为解决方法,将结果存储在变量中并使用echo
有助于:
a=$(find /tmp/test/ -type f)
echo $a | sed "s: :,:g"
/tmp/test/b,/tmp/test/a
sed
如何使用 4.4实现相同的输出here-string
?
更新
两个系统之间的 bash 版本也发生了变化:
bash --version
GNU bash, version 4.4.20
旧版
bash --version
GNU bash, version 4.3.48
答案1
这是一个改变bash
版本 4.3 和 4.4之间
正如文档一直所说的那样,Bash 不再拆分此处字符串的扩展。
正确的行为是您的新版本,因为您依赖于旧代码的错误。
这将为您提供一个以逗号分隔的文件列表,
find -type f | tr '\n' , | sed 's/,$/\n/'
然而,由于文件名本身可以包含换行符和逗号,因此很容易破坏这种脆弱的代码。如果您愿意在新问题中分享您的处理过程,我相信有人会推荐一种更好的方法来可靠且安全地处理文件名。