我们说我有这个文件(file.txt
):
Hello my name is Giorgio,
I would like to go with you
to the cinema my friend
我想从文字中排除以下字词:my
,is
和I
(不是整行)。
单词位于文件(words.txt
)中,如下所示:
my
is
I
所以输出必须是:
Hello name Giorgio,
would like to go with you
to the cinema friend
如何执行此操作?
答案 0 :(得分:3)
您可以使用sed将words.txt转换为sed脚本:
sed 's=^=s/=;s=$=//g=' words.txt | sed -f- file.txt
与预期输出的差异是空白:删除单词不会挤压周围的空白。
要仅匹配整个单词,请添加单词边界\b
:
s=^=s/\\b=;s=$=\\b//g=
Perl解决方案也挤压空间(并不关心元字符):
#!/usr/bin/perl
use warnings;
use strict;
open my $WORDS, '<', 'words.txt' or die $!;
my %words;
chomp, $words{$_} = q() while <$WORDS>;
open my $TEXT, '<', 'file.txt' or die $!;
while (<$TEXT>) {
s=( ?\b(\S+)\b ?)=$words{$2} // $1=ge;
print;
}
答案 1 :(得分:1)
这应该这样做:
#!/bin/bash
cp file.txt newfile.txt # we will change newfile.txt in place
while IFS= read -r line;do
[[ $line != "" ]] && sed -i "s/\b$line[[:space:]]*//g" newfile.txt
done <words.txt
cat newfile.txt
或修改@ choroba&#39; sed
解决方案:
sed 's=^=s/\\b=;s=$=[[:space:]]*//g=' words.txt | sed -f- file.txt
以上两种方法都会从匹配字符串的末尾删除空格(如果有的话)。
输出:
Hello name Giorgio,
would like to go with you
to the cinema friend #There's a space here (after friend)
答案 2 :(得分:1)
awk中相当邋。的版本。如果单词列表包含元字符,那么这将会死亡。但它确实考虑了单词边界,因此在单词中间不匹配。
awk 'FNR==NR{a[$1];next}
{for(i in a)gsub("(^|[^[:alpha:]])"i"([^[:alpha:]]|$)"," ")}1' {words,file}.txt
Hello name Giorgio,
would like to go with you
to the cinema friend
它将第一个文件中的单词保存到数组a
中。
在保存的每个单词的下一个文件中,它只是使用alpha(所有字母字符)和行开头和结尾从行中删除该单词以确保单词是完整单词。 1
打印该行。