有人知道如何在我的命令中指定“部分匹配”,而不是“完全匹配”吗? Cygwin,视窗

问题描述 投票:0回答:1

几周来我一直在努力寻找解决方案,我在这里和其他地方至少阅读了 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。

file sed grep duplicates cygwin
1个回答
0
投票

一行 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'

我希望这可以帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.