在文本中省略单词

时间:2015-06-18 13:19:19

标签: regex bash text-processing

我们说我有这个文件(file.txt):

Hello my name is Giorgio,
I would like to go with you
to the cinema my friend

我想从文字中排除以下字词:myisI(不是整行)。

单词位于文件(words.txt)中,如下所示:

my
is
I

所以输出必须是:

Hello name Giorgio,
would like to go with you
to the cinema friend

如何执行此操作?

3 个答案:

答案 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打印该行。