我想做的是我想在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
。