首页 > 解决方案 > 在 sed 命令中使用管道中的 STDIN 替换文件中的值

问题描述

我有一个命令来执行一系列生成可变输出字符串的命令,例如123456. 我想将它传递给一个命令,该sed命令替换 csv 文件中的已知字符串,如下所示: Fred,Wilma,Betty,Barney

但是,下面的命令不起作用,我还没有找到任何其他使用管道值作为替换变量的参考。

如果 csv 中的值是随机顺序并且我总是想更改第二个值,那么此代码将如何更改?

示例代码:

find / -iname awk 2>/dev/null | sha256sum | cut -c1-10 > test.txt | 
sed -i -e '/Wilma/ r test.txt' -e 's/Wilma//' input.csv

input.csv 的内容应该变成:Fred,0d522cd316,Betty,Barney

标签: linuxbashshellsed

解决方案


好的,在

find / -iname awk 2>/dev/null | sha256sum | cut -c1-10 > test.txt | sed -i -e '/Wilma/ r test.txt' -e 's/Wilma//' input.csv

你有一个错误。剪切后的“> test.txt”会在sed上吃掉你的stdin,所以在使用stdin之后那个管道会变得很奇怪。您不希望那里有管道,或者您不想重定向到文件。

采用管道标准输入并将其用作命令中的参数的方法是通过xargs.

find / -iname awk 2>/dev/null | sha256sum | cut -c1-10 | xargs --replace=INSERTED -- sed -i -e 's/Wilma/INSERTED/' input.csv

(......虽然 find|shasum 也是可疑的,因为文件的顺序是随机的(ish),并且对于可靠的总和很重要。您可能的意思是在 find 之后“|排序”。)

(有些会sed -i -e "s/Wilma/$(find|sort|shasum|cut)" f,但我不在其中。动物。)


推荐阅读