Работает в /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