我在下面举一个例子

我在下面举一个例子

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.

相关内容