在sed命令中从管道使用STDIN替换文件中的值

时间:2019-07-13 22:30:50

标签: linux bash shell sed

我有一条命令来执行一系列命令,这些命令会产生诸如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

2 个答案:

答案 0 :(得分:2)

好吧,

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),并且对于可靠的总和很重要。您可能希望在找到之后进行“ | sort”。)

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

答案 1 :(得分:1)

  1. 要替换诸如“ Wilma” 之类的固定字符串,请尝试:

    sed -i 's/Wilma/'"$(find / -iname awk 2>/dev/null | 
                        sha256sum | cut -c1-10)"'/' input.csv
    
  2. 要替换第二个字段,请尝试:

    sed -i 's/[^,]*/'"$(find / -iname awk 2>/dev/null | 
                        sha256sum | cut -c1-10)"'/2' input.csv