删除列表中类似文件中的行

Remove line in a file in similar found in a list

我有一个包含路径(几千行)的文件“selected_files.log”,我有一个排除文件“exclusion.txt”,其中包含我不想在我的文件中看到的路径和扩展名selected_files.log

我一直在尝试使用 grep 和 sed,但没有成功 这是我最后一次搜索。有人帮忙吗?谢谢

lines=$(cat exclusion.txt)
for x in "$lines";
do
    grep -v "$x" "selected_files.log" > new_file.log
    echo "x is $x"
    #sed `/$x/d` -i "selected_files.log" 
done

Comm -23 不起作用,因为文件未排序。 我试过 "/"$x"/d" -i 但没有运气:未终止的地址正则表达式

我的文件包含的示例 selected_files.log

/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/external.log
/mnt/user/system/data/A12/internal.log
/mnt/user/system/input/system_run.sh 
/mnt/user/system/input/user.sh
/mnt/user/system/output/results.dt 
/mnt/user/david/test/test.sh
/mnt/user/david/prod/bdd.bkp
/mnt/user/system/old_bkp.tmp
/mnt/user/system/output/test space/test.tmp

exclusion.txt

external.log
/mnt/user/system/input/
david
.tmp

想要的结果:

/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/internal.log
/mnt/user/system/output/results.dt 
grep -Fvxf exclusion.txt selected_files.log >> tmp && cat tmp > selected_files.log
awk 'NR==FNR{a[[=11=]];next} !([=11=] in a)' exclusion.txt selected_files.log >> tmp && cat tmp > selected_files.log
gawk -i inplace 'NR==FNR{a[[=12=]];next} !([=12=] in a)' exclusion.txt selected_files.log

注意:它会就地编辑 selected_files.log 但也会擦除 exclusion.txt

似乎是 for 循环引起了问题。 尝试

cat exclusion.txt | while read f; do sed "/^${f//\//\\/}$/d" selected* -i; done

更新循环工作

猫selected_files.log

/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/external.log
/mnt/user/system/data/A12/internal.log
/mnt/user/system/input/system_run.sh 
/mnt/user/system/input/user.sh
/mnt/user/system/output/results.dt 
/mnt/user/david/test/test.sh
/mnt/user/david/prod/bdd.bkp
/mnt/user/system/old_bkp.tmp

猫exclusion.txt

external.log
/mnt/user/system/input/
david
.tmp
IFS=$'\n' && for f in `cat exclusion.txt`; do sed "/^"${f//\//\\/}"$/d" selected_files.log -i; done

lines="$(cat exclusion.txt)"
for x in `echo "$lines"`; 
do  grep -v "$x" "selected_files.log" > new_file.log; 
echo "x is $x"; 
sed "/^"$(echo "${x//\//\\/}")"$/d" selected_files.log -i; 
done

猫selected_files.log

/mnt/user/system/data/S97/001584.bkp
/mnt/user/system/data/S97/00284.bkp
/mnt/user/system/data/S97/0058244.bkp
/mnt/user/system/data/A12/internal.log
/mnt/user/system/output/results.dt 

Select 如果能解决你的问题就回答

感谢 Haru,我的解决方案是综合了所有方法。

lines="$(cat "exclusion.txt")"
IFS=$'\n'
for x in `echo "$lines"`; 
do echo "x is $x"; 
grep -v "$x" "selected_files.log" > new_file.log; 
sed "/"$(echo "${x//\//\\/}")"/d" "selected_files.log" -i; 
done
unset IFS