首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带to string的sed失败,但当echo输出以管道方式发送到sed时成功。

带to string的sed失败,但当echo输出以管道方式发送到sed时成功。
EN

Unix & Linux用户
提问于 2022-01-09 17:34:54
回答 1查看 207关注 0票数 2

在将sed更新为4.4版本后,sed不会在作为here-string提供的find命令的输出中用逗号替换空格:

代码语言:javascript
复制
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中没有问题

代码语言:javascript
复制
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有助于:

代码语言:javascript
复制
a=$(find /tmp/test/ -type f)
echo $a | sed "s: :,:g" 
/tmp/test/b,/tmp/test/a

如何在sed 4.4中使用here-string实现相同的输出?

<#>更新

bash的版本在这两个系统之间也发生了变化:

代码语言:javascript
复制
bash --version
GNU bash, version 4.4.20

旧版本

代码语言:javascript
复制
bash --version
GNU bash, version 4.3.48
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-01-09 17:57:56

这是一个介于变化版本4.3和4.4之间的bash

Bash不再像文档中常说的那样,拆分这里字符串的扩展。

正确的行为是您的新版本,因为您依赖于旧代码中的bug。

这会给你一个逗号分隔的文件列表,

代码语言:javascript
复制
find -type f | tr '\n' , | sed 's/,$/\n/'

但是,由于文件名本身可以包含新行和逗号,所以很容易破坏这种脆弱的代码。如果你愿意分享你的处理-在一个新的问题-我相信有人会推荐一个更好的方式处理文件名可靠和安全。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/685678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档