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

Dri*_*ven 4 linux bash grep sed shell-script

内容source.txt

gold  green white black blue
yellow magenta brown 
tram kilo charlie tango
Run Code Online (Sandbox Code Playgroud)

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

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

grep -l "gold" source.txt | xargs sed  's/green/red/' >  pol.txt
Run Code Online (Sandbox Code Playgroud)

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

gold  red white black blue
Run Code Online (Sandbox Code Playgroud)

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

gold  red white black blue
yellow magenta brown 
tram kilo charlie tango
Run Code Online (Sandbox Code Playgroud)

当我-l从 grep 命令中删除选项时,我有这个,当然 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
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*024 6

以选择包含任何线gold从的Source.txt和替换的第一次出现greenred

$ sed  -n '/gold/{s/green/red/; p}' source.txt 
gold  red white black blue
Run Code Online (Sandbox Code Playgroud)

要将其保存在文件中:

sed  -n '/gold/{s/green/red/; p}' source.txt  >pol.txt
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

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

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

  • s/green/red/ 执行替换

  • p 印刷。

使用 awk

同样的逻辑:

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

使用 grep

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

$ grep -l --null "gold" source.txt | xargs -0 sed  -n '/gold/s/green/red/p'
gold  red white black blue
Run Code Online (Sandbox Code Playgroud)

  • @Driven 为什么您认为需要 grep 作为测试人员?sed 完全有能力做同样的测试。除非您有其他一些尚未解释的要求? (2认同)