内容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
并将第一次出现的 替换green
为red
:
$ 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.txt
source.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
执行您想要的替换。