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

removing prepositions from a text file in linux

我想做的是在 CentOS 中删除文本文件中的所有介词。像 'on of to the in at ....' 这样的东西。这是我的脚本:

!/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相同。我不知道这是否是一个好方法。有什么建议吗?任何方法?

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

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

您想确保包括单词边界;您最初的尝试将取代例如i 输入的任何地方。

如果字符串中已有单词,可以将其插入 Bash 和

sed "s/\<\(${list// /\|}\)\> \?//g" Hamlet.txt >newHam.txt

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

不幸的是,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;脚本的第一行需要恰好以 #! 这两个字符开头,因为这就是它成为 shebang 的原因。您以后还需要避免使用 useless cat