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

For each line L of a file file1.txt, remove the line of the file composer.json that contains L

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

中删除我的 file1.txt 的所有包

file1.txt

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

Current 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

Wanted 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的内容

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

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

grep

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

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