从Linux中的文本文件中删除介词

时间:2019-01-06 06:04:35

标签: linux shell sed text-mining

我想做的是我想删除CentOS文本文件中的所有介词。诸如“在...上到在...上”之类的事情。这是我的脚本:

!/bin/bash
list='i me my myself we our ours ourselves you your yours yourself ..... '
cat Hamlet.txt | for item in $list
do
sed 's/$item//g' 
done > newHam.txt

但是最后,当我打开newHam.txt时,什么都没有改变!与Ham.txt相同。我不知道这是否是一个好方法。有什么建议吗?任何办法?

1 个答案:

答案 0 :(得分:1)

假设您的sed理解\<\>的单词边界,

sed 's/\<\(i\|me\|my\|myself|\we|\our|\ours|\ourselves|\you|\your|\yours|\yourself\)\> \?//g' Hamlet.txt >newHam.txt

您要确保包含单词边界;您最初的尝试将取代例如i在nput处无处不在。

如果您已经在字符串中包含单词,则可以使用

在Bash中进行插值
sed "s/\\<\\(${list// /\\|}\\)\\> \\?//g" Hamlet.txt >newHam.txt

,但是${variable//pattern/substitution}参数扩展不能移植到例如/bin/sh。还请注意,如何允许双引号而不是单引号使外壳在脚本内执行变量替换,以及如何用双引号将所有文字反斜杠转义为另一个反斜杠。

不幸的是,sed的许多细节标准化程度很低。具有讽刺意味的是,切换到根本不是标准的工具可能是最可移植的解决方案。

perl -pe 'BEGIN {
    @list = qw(i me my myself we our ours ourselves you your yours yourself .....);
    $re = join("|", @list); }
    s/\b($re)\b ?//go' Hamlet.txt >newHam.txt

如果您希望将其作为独立脚本,

#!/usr/bin/perl

BEGIN {
    @list = qw(i me my myself we our ours ourselves you your yours yourself .....);
    $re = join("|", @list);
}
while (<>) {
    s/\b($re)\b ?//go;
    print
}

这些单词是代词,不是介词。

最后,请注意修复脚本的shebang;脚本的第一行必须完全以两个字符#!开头,因为这就是使它爆炸的原因。您还希望将来避免使用useless cat