Відповіді:
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
Подумайте, чи є у вас файл, file_name
і ви хочете шукати мишу, але в той же час кілька рядків у миші, які мають інші слова, такі як cat
і, rat
і ви не хочете бачити їх у своєму висновку, тож один із способів зробити це -
grep -r mouse file_name | grep -vE "(cat|rat)"
Працює в /bin/sh
, що знаходиться dash
на Ubuntu, а також ksh
, і bash
. Трохи незручно, що вам потрібно написати кілька тестових випадків для кожного слова у case
висловлюванні, але переносно. Працює з випадками, коли слово з’являється поодинці на рядку, на початку, в кінці рядка або середині рядка, і ігнорує, де воно може бути частиною іншого слова.
#!/bin/sh
line_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 cat
the cat who likes milk
jumped over gray rat
concat
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt
concat
this is catchy
rational
irrational