Как удалить строки из текстового файла, содержащие определенные слова, через терминал?

Как удалить все строки из текстового файла, содержащие слова "кошка" и "крыса"?

grep подход

Чтобы создать копию файла без строк, соответствующих "cat" или "rat", можно использовать grep в обратном порядке (-v) и с опцией полного слова (-w).

grep -vwE "(cat|rat)" sourcefile > destinationfile

Опция "целое слово" гарантирует, что оно не будет совпадать cats или grateful например. Используется перенаправление вывода вашей оболочки (>), чтобы записать его в новый файл. Нам нужны -E опция для включения расширенных регулярных выражений для (one|other) синтаксис.

sed подход

В качестве альтернативы, чтобы удалить линии на месте, можно использовать sed -i:

sed -i "/\b\(cat\|rat\)\b/d" filename

То \b устанавливает границы слов и d операция удаляет строку, соответствующую выражению между косыми чертами. cat и rat оба сопоставляются с помощью (one|other) синтаксис, который нам, по-видимому, нужно экранировать с помощью обратной косой черты.

Совет: используйте sed без того, чтобы -i оператор для проверки выходных данных команды перед перезаписью файла.

(На основе Sed - Удаление строки, содержащей определенную строку)

Для тестирования только в терминале используйте:

sed '/[cr]at/d' file_name

Чтобы действительно удалить эти строки из файла, используйте:

sed -i '/[cr]at/d' file_name

Попробуйте использовать ex команда (часть Vi/Vim):

ex +"g/[cr]at/d" -scwq file.txt

Вышесказанное имеет преимущество перед другими инструментами, такими как sed из-за его нестандартная FreeBSD -i (на месте) расширение и может быть недоступен в других операционных системах. Во-вторых sed это Sтопчан редitor, а не редактор файлов.

Использование awk для исключения строк, содержащих определенные слова:

$ awk '!/\<(cat|rat)\>/{print $0}' ./input.txt

синтаксис awk:

  • !/regex/ Печатайте только те строки, которые не соответствуют регулярному выражению.
  • | Оператор чередования, используемый для указания альтернатив.
  • (...) Группировка, например группировка операторов чередования.
  • \< Соответствует пустой строке в начале слова.
  • \> Соответствует пустой строке в конце слова.
  • {...} Заявление о действиях.

Удалите строки из всех файлов, которые соответствуют совпадению

grep -rl 'text_to_search' . | xargs sed -i '/text_to_search/d'

Подумайте, есть ли у вас файл с file_name и вы хотите выполнить поиск мыши, но в то же время в нескольких строках от мыши есть другие слова, такие как cat и rat и вы не хотите видеть их в своих выходных данных, поэтому единственный способ сделать это - -

grep -r mouse file_name | grep -vE "(cat|rat)"

способ портативной оболочки

Работает в /bin/sh, который является dash на Ubuntu, а также ksh, и bash. Немного неудобно, что вам приходится писать несколько тестовых примеров для каждого слова в case заявление, но переносимое. Работает со случаями, когда слово появляется отдельно в строке, в начале, конце строки или в середине строки, и игнорирует, где оно может быть частью другого слова.

#!/bin/shline_handler(){   # $1 is line read, prints to stdout    case "$1" in        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line        rat|rat\ *|*\ rat\ *|*\ rat) true;;         *) printf "%s\n" "$1"    esac}readlines(){    # $1 is input file, the rest is words we want to remove    inputfile="$1"    shift    while IFS= read -r line;    do        line_handler "$line" "$@"    done < "$inputfile"    [ -n "$line" ] && line_handler "$line" }readlines "$@"

И вот как это работает:

$ cat input.txt                                                                                                                                                        the big big fat catthe cat who likes milk jumped over gray ratconcat this is catchyratrationalirrational$ ./dellines.sh input.txt                                                                                                                                              concat this is catchyrationalirrational
cat logs.txt | grep 'your regex' > logs_regex.txt

Это приведет к созданию нового файла logs_regex.txt который является копией вашего файла logs.txt только со строками, содержащими ваше регулярное выражение

Это подозрительно похоже на домашнее задание. Пожалуйста, не забудьте приписать свой ответ милым людям из Askubuntu.

Это часть большого проекта, я новичок в среде Linux.