对于文件file1.txt的每一行L,删除包含L的文件composer.json的行

时间:2017-10-25 15:39:15

标签: shell sed diff

我有一个 file1.txt 文件,其中包含近40行,每行包含一个包名。 我有另一个文件 composer.json ,其中包含数百个包。我需要从 composer.json

中删除 file1.txt 的所有包
  

FILE1.TXT

remote5/package40
remote1/package1
remote4/package3
...
remote1/package2
  

当前的composer.json

{
    "name": "name/project_name",
    "description": "sf project blabla",
    ...
    "config": {
        "installer-paths: {
            "remote34/package345",
            "remote21/package345",
            "remote123/package345",
            "remote384/package345",
            "remote444/package345",
            ...
            "remote1/package1",
            "remote1/package2",
            "remote4/package3",
            ...
            "remote5/package40",
         }
     }
}

如您所见,文件不同,因此我无法使用此解决方案Remove Lines from File which appear in another File

  

通缉composer.json

{
    "name": "name/project_name",
    "description": "sf project blabla",
    ...
    "config": {
        "installer-paths: {
            "remote34/package345",
            "remote21/package345",
            "remote123/package345",
            "remote384/package345",
            "remote444/package345",
            ...
         }
     }
}

这是我到目前为止一直在尝试的命令

for i in `cat file1.txt`; do echo $i && sed -i '/$i/d' composer.json; done

这不会改变 composer.json 。但是,下面的命令可以正常工作

sed -i '/remote4\/package3/d' composer.json

更新

grep -Fvxf file1.txt composer.json

输出完全是 composer.json 的内容

2 个答案:

答案 0 :(得分:1)

grep

grep -Fvf <(sed 's/.*/"&",/' file1.txt) composer.json

使用json格式装饰搜索键并查找固定字符串匹配。

答案 1 :(得分:0)

显然,你的composer.json无效。 有了您的数据,您可以尝试

awk 'NR==FNR{a[$0];next} {b=$0;sub("[^\"]*\"","");sub("\"[^\"]*$","");if(!($0 in a))print b}' file1.txt composer.json