Я хочу удалить текст из 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
Это внесет изменения в исходный файл.