带有此处字符串的 sed 失败,但当 echo 输出通过管道传输到 sed 时成功

带有此处字符串的 sed 失败,但当 echo 输出通过管道传输到 sed 时成功

更新sed4.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

sed4.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/'

然而,由于文件名本身可以包含换行符和逗号,因此很容易破坏这种脆弱的代码。如果您愿意在新问题中分享您的处理过程,我相信有人会推荐一种更好的方法来可靠且安全地处理文件名。

相关内容