几周来我一直在努力寻找解决方案,我在这里和其他地方至少阅读了 50 多个主题,但没有一个适合我的案例。 ChatGPT 也帮不上忙。我在 Windows 上使用 Cygwin 最新版本 (3.4) :
文件 1:“remove.txt”
Word
Sentence
Number
文件 2:“input.txt”
Word1
College
Sentence
Number.day
School
文件 3:“output.txt”= 我需要的结果文件:
College
School
目前,我使用:
while read pattern; do
grep -vF "$pattern" input.txt > output.txt && mv output.txt input.txt;
done < remove.txt
但是,它只删除了上面示例中的单词
Sentence
,因为它是完全匹配的。出于某种原因,它无法删除我需要的部分匹配项。
我也尝试了很多使用sed的解决方案,但什么也做不了;如果
remove.txt
文件只有 1 个单词,在 1 行中,他们就可以工作,但在我的情况下,要删除许多模式(很多单词,每个在不同的行中),如果 >1 行模式,它就不起作用.
上面的命令是更接近工作的命令,但只有完全匹配。
非常感谢!
我想我已经解释了上面的一切。
------------------------------------------------ ---------- 编辑:
我目前正在使用: grep -vf remove.txt 输入.txt > 输出.txt
“remove.txt”包含:
Word
Sentence
Number
“output.txt”结果为:
Word1
College
School
“Word1”应该被删除,但由于某些原因,Cygwin 无法使用此命令删除所有模式。它确实删除了“Sentence”和“Number.day”。
但是 - 更新 - 当 remove.txt 文件中的模式“Word”位于最后一行(第 3 行)时,它会从输入文件中删除“Word1”。但是当“Word”位于 remove.txt 文件的第一行或第二行时,它根本不会删除该模式。
为了更清楚--------
当“remove.txt”包含:
Sentence
Number
Word
output.txt 文件以(这次“Number.day”没有被删除)结束:
College
Number.day
School
当“remove.txt”在文件开头包含 Word 时:
Word
Sentence
Number
output.txt文件是:
Word1
College
School
似乎无法弄清楚为什么该命令不会将所有模式 1 对 1 循环并全部删除,如果部分匹配,而是根据“remove.txt”文件中的顺序只删除 1。
一行 shell 脚本可以做到这一点:
cat remove.txt | xargs -I % sed -i '/%/d' input.txt
xargs 命令的"-I" 标志将使以下符号 (%) 成为字符串持有者,以存储来自先前命令“cat remove.txt”的传入参数。
您可以为 xargs 添加“-t”标志以查看 xargs 的详细输出。在这种情况下,输出是
sed -i /Word/d input.txt
sed -i /Sentence/d input.txt
sed -i /Number/d input.txt
sed命令使用"-i"执行相同的文件修改,因此我们可以将结果输出到相同的输入文件(input.txt)。 sed的'/%/d'命令会匹配remove.txt中传入的字符串,并移除input.txt中匹配的字符串。
如果你想删除匹配的词而不是整行。可以将sed命令由'/%/d'修改为's/%[0-9a-zA-Z.]*//g'
我希望这可以帮助:)