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

最佳答案

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

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


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

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

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

10-07 18:38