
Я хочу удалить часть текста из file1.txt
.
Я помещаю текст в файл tmp
и делаю:
grep -f tmp file.txt
Но это дает мне только разницу.
Вопрос в том, как убрать разницу из file.txt
.
решение1
Doing grep -f tmp file.txt
отобразит все строки, содержащие слово text
(предположим, tmp
содержит только слово text
). Если вы хотите отобразить все строки, которые не содержат слово text, вам нужно использовать опцию -v
инвертирования соответствия:
$ grep -v 'text' file.txt
Если вывести все строки в файле, но просто удалить все вхождения, то text
:
$ sed 's/text//g'
решение2
Если вы хотите удалить строки из вашего файла file.txt
, содержащие строку, где text
находится seed, то вы можете сделать что-то вроде:
sed '/text/d' file.txt
или
sed -n '/text/!p' file.txt
решение3
То, что вы хотите сделать, это
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
решение4
Что я делаю:
sed '/text_to_delete/d' filename | sponge filename
Это внесет изменения в исходный файл.