我有一条命令来执行一系列命令,这些命令会产生诸如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
答案 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)
要替换诸如“ Wilma” 之类的固定字符串,请尝试:
sed -i 's/Wilma/'"$(find / -iname awk 2>/dev/null |
sha256sum | cut -c1-10)"'/' input.csv
要替换第二个字段,请尝试:
sed -i 's/[^,]*/'"$(find / -iname awk 2>/dev/null |
sha256sum | cut -c1-10)"'/2' input.csv