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

5
我有一个命令,可以执行一系列命令并生成一个变量输出字符串,例如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

你能给一个 input.csv 文件中的示例行吗? - user2849202
你的管道和重定向有点混乱。查看输入.csv和期望的输出可能会更好地理解你正在尝试做什么和达到什么目的。 - user2849202
我认为你可以滥用猫。sed -i -e 's/Wilma/'"$(cat)"'/' input.csvfind / -iname awk 2>/dev/null | sha256sum | cut -c1-10 的输出是什么? - KamilCuk
CSV文件是否总是只有一行? - agc
2个回答

4

Okay, in

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

你有一个bug。在cut之后的"> test.txt"将会吃掉sed的标准输入,所以之后的管道操作就会出现问题。你不想要那里的管道符,或者你不想重定向到一个文件。
将传递的标准输入作为命令参数的方式是通过xargs实现的。
find / -iname awk 2>/dev/null | sha256sum | cut -c1-10 | xargs --replace=INSERTED -- sed -i -e 's/Wilma/INSERTED/' input.csv

(虽然find|shasum也值得怀疑,因为文件的顺序是随机的,并且它对于可靠的校验和很重要。你可能想在find后面加上"|sort"。)

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


3
  1. For replacing a fixed string like "Wilma", try:

    sed -i 's/Wilma/'"$(find / -iname awk 2>/dev/null | 
                        sha256sum | cut -c1-10)"'/' input.csv
    
  2. To replace the 2nd field no matter what's in it, try:

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

1
动物风格,耶! - agc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接