удаление предлогов из текстового файла в Linux - PullRequest
0 голосов
/ 06 января 2019

Я хочу удалить все предлоги в текстовом файле в 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 голосов
/ 06 января 2019

Предполагая, что ваши 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 в будущем.

...