2017-11-18 203 views
0

我有四个名为source,correct,wrong和not_found的文件。我试图在bash中编写脚本,其中我从源文件中读取每行,将行存储为变量x,并将其与条件匹配。Bash:从匹配变量的文件中删除一行

如果它通过,那么我需要将该行写入文件名为correct,但是catch在写入到正确前我需要检查变量x当前是否存在于名为wrong的文件中,如果是,请删除它,然后将该行添加到名为correct的文件。

下面我都试过了,但它不修改该文件并没有给我任何输出:

sed -i '/$x/d' ./wrong 
+0

我想你的意思是'sed',而不是'send'。如果你使用单引号,就不会有扩展,所以你实际上是在寻找'$ x'(字面上),而不是那个变量的内容。改为使用双引号:'sed -i“/ $ x/d”。/ wrong“ –

+0

感谢您指出错误。这实际上是我的iPad做自动更正。我现在纠正了错误。 –

+0

'sed'不修改文件:从标准输入中读取并在标准输出上写入。您需要将结果放在某处,然后替换原始文件。如:'sed -i'/ $ x/d'./wrong> ./wrong.new && mv ./wrong ./wrong.old && mv ./wrong.new。/ wrong'(如果您想保留旧的副本)。 – fernand0

回答

0

正如你已经明白了,里面'...'变量没有扩大。

如果换成单引号用双引号, 这将从./wrong删除匹配行:

sed -i "/$x/d" ./wrong 

但你也想将行添加到./correct,如果有一个匹配。 要做到这一点,你可以在sed之前运行grep

grep "$x" ./wrong >> ./correct 

这将产生预期的效果,但 将sed覆盖./wrong,即使它并不需要。 你可以防止像这样:

if grep "$x" ./wrong >> ./correct; then 
    sed -i "/$x/d" ./wrong 
fi 
+0

感谢Janos,我实际上需要删除包含x的行和从./wrong后面的下两行。另外, –

+0

感谢Janos,我实际上需要删除包含x的行以及从./wrong后面的下两行。所以,我在做如果grep“$ x”./wrong;then ;sed -i“/ $ x /,+ 2d”./wrong;echo $ x >> ./正确; echo line2 >> ./正确: fi我正在运行一个单独的for循环之前,如果循环保持行2和行3。我是否想从错误中删除x的决定取决于line2和line3。因此,我不能直接从错误中直接复制包含x和下两行的行来纠正。 –

+0

@DattarayaHonrao您正在添加不属于原始问题的重要新细节。问一个新问题会更好,包括你真正需要的所有细节。 – janos