grep 文件并将输出通过管道传输到 sed,并将 sed 输出存储在文件中

grep 文件并将输出通过管道传输到 sed,并将 sed 输出存储在文件中

内容source.txt

gold  green white black blue
yellow magenta brown 
tram kilo charlie tango

大家好!我需要解开一个谜团。

我正在尝试运行一个小脚本来 grep 一个文件source.txt,管道grep输出以sed替换字符串并将该行存储在新文件中pol.txt

grep -l "gold" source.txt | xargs sed  's/green/red/' >  pol.txt

而不是只将那一行存储在pol.txt

gold  red white black blue

我有整个文件本身以及我替换的字符串

gold  red white black blue
yellow magenta brown 
tram kilo charlie tango

当我从 grep 命令中删除选项时,-l我得到了这个,当然 pol.txt 中什么都没有

sed: can't read gold: No such file or directory
sed: can't read green: No such file or directory
sed: can't read white: No such file or directory
sed: can't read black: No such file or directory
sed: can't read blue: No such file or directory

grep需要作为一名测试人员,不幸的是“如果”不是一个选项。

答案1

从 source.txt 中选择任何包含 的行gold并将第一次出现的 替换greenred

$ sed  -n '/gold/{s/green/red/; p}' source.txt 
gold  red white black blue

要将其保存在文件中:

sed  -n '/gold/{s/green/red/; p}' source.txt  >pol.txt

怎么运行的

  • -n告诉 sed 不要打印行,除非我们明确要求它这样做。

  • /gold/选择与正则表达式匹配的行gold

  • s/green/red/执行替换

  • p印刷。

使用 awk

同样的逻辑:

$ awk '/gold/{gsub(/green/, "red"); print}' source.txt 
gold  red white black blue

使用 grep

如果由于尚未解释的原因我们被迫使用 grep 管道,那么请尝试:

$ grep -l --null "gold" source.txt | xargs -0 sed  -n '/gold/s/green/red/p'
gold  red white black blue

答案2

grep -l "gold" source.txtsource.txt如果文件包含单词 gold 将会xargs sed 's/green/red/'输出sed 's/green/red/' source.txt,并且最后的重定向会将结果保存在输出中。

如果我正确理解了您的意图,您需要以下命令:

sed -n '/gold/s/green/red/p' source.txt > pol.txt

/gold/选择匹配的行然后gold命令s执行您想要的替换。

相关内容