Предполагая, что ваши 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
. Обратите также внимание на то, что двойные кавычки вместо одинарных необходимы для того, чтобы оболочке было разрешено выполнять подстановки переменных в скрипте, и как все буквальные обратные косые черты необходимо экранировать с помощью другой обратной косой черты в двойных кавычках.
К сожалению, многие детали 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
}
Эти слова являются местоимениями, а не предлогами.
Наконец, позаботьтесь о том, чтобы исправить сценарий вашего сценария; первая строка скрипта должна начинаться именно с двух символов #!
, потому что это то, что делает его шебангом. Вы также хотите избежать бесполезных cat
в будущем.