Я хочу удалить текст из file1.txt .
Я помещаю текст в файл tmp и делаю:
grep -f tmp file.txt
Но это дает мне только разницу.
Вопрос в том, как убрать разницу из file.txt .
Выполнение grep -f tmp file.txt отобразит все строки, содержащие рабочий text (предположим, что tmp просто ограничивает рабочий text). Если вы хотите отобразить все строки, которые не содержат текст слова, вам нужно использовать опцию -v чтобы инвертировать соответствие:
$ grep -v 'text' file.txt
Если вы печатаете все строки в файле, но просто удаляете все вхождения text тогда:
$ sed 's/text//g'
Если вы хотите удалить строки из вашего file.txt который содержит строку, в которой text является семенем, вы можете сделать что-то вроде:
sed '/text/d' file.txt
или же
sed -n '/text/!p' file.txt
Что вы хотите сделать, это
grep -Fvf tmp file.txt
От man grep:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The
empty file contains zero patterns, and
therefore matches nothing. (-f is specified
by POSIX.)
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings,
separated by newlines, any of which is to be
matched. (-F is specified by POSIX.)
-v, --invert-match
Invert the sense of matching, to select non-
matching lines. (-v is specified by POSIX.)
Итак, -f говорит grep прочитать список шаблонов, которые он будет искать из файла. -F необходим, чтобы grep не интерпретировал эти шаблоны как регулярные выражения. Таким образом, учитывая строку как foo.bar . будет воспринято как буквальное . а не как "соответствовать любому персонажу". Наконец, -v инвертирует совпадение, поэтому grep будет печатать только те строки, которые не соответствуют ни одному из шаблонов в tmp . Например:
$ cat pats
aa
bb
cc
$ cat file.txt
This line has aa
This one contains bb
This one contains none of the patterns
This one contains cc
$ grep -Fvf pats file.txt
This one contains none of the patterns
Что я делаю, это:
sed '/text_to_delete/d' filename | sponge filename
Это внесет изменения в исходный файл.