Unix 和 Sed 菜鸟在这里!
我有一个要求,需要添加后缀“,放弃”如果报告中的一行包含匹配的字符串。匹配的字符串是另一个文件的一部分“放弃.txt”。我还尝试对主报告的副本执行这些操作。
我在下面举一个例子
报告如下所示:
i love apple_tart as a desert
banana is full of potassium and iron
there are so many helath benefits of apple eating
the king of fruit is mango
there are apple_pie of many variety
这是如何放弃.txt好像:
apple_pie
banana
这是我想要在同一文件中的预期输出:
i love apple_tart as a desert
banana is full of potassium and iron,waive
there are so many helath benefits of apple eating
the king of fruit is mango
there are apple_pie of many variety,waive
这是我尝试过的脚本,但它给出了非法变量名 错误
#!/bin/csh -f
if (-r fruits_bkup.txt) then
rm fruits_bkup.txt
endif
yes|cp fruits.txt fruits_bkup.txt
foreach word ("`cat waiver.txt`")
sed -i "/${word}/s/$/ ,waived/" fruits_bkup.txt
end
如果我在 sed 命令中将双引号替换为单引号,则报告不会发生任何变化。
谢谢!
本来期待:
i love apple_tart as a desert
banana is full of potassium and iron,waive
there are so many helath benefits of apple eating
the king of fruit is mango
there are apple_pie of many variety,waive
得到: 非法变量名 错误
答案1
为了避免 shell 的怪癖csh
,我们可以用一个命令来解决这个问题(如果您愿意,awk
可以将其放入脚本中)。csh
这也使我们能够减少需要对输入文件进行的传递次数(我们只需要一次传递)。
awk 'NR==FNR { query[++n] = $0; next } { for (i in query) if ($0 ~ query[i]) { $0 = $0 ",waive"; break } };1' waive.txt report.txt
该命令首先将第一个文件 的行读取waive.txt
到关联数组 中query
。当我们到达第二个文件 时report.txt
,我们迭代 中的模式query
并针对当前行测试每个模式。如果存在匹配,我们将添加,waive
到该行的末尾并终止循环。
最后,尾随1
导致(可能已修改的)行被输出。
请注意,这使用第一个文件中的文本作为正则表达式。如果您想进行字符串比较,请在代码中使用index(query[i],$0)
in $0 ~ query[i]
。
要将结果写回原始文件,请将输出通过管道传输到sponge report.txt
,或将其重定向到新文件名,然后将该新文件重命名为report.txt
.