Как удалить все строки из текстового файла, содержащие слова "кошка" и "крыса"?
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.