1

Я хочу удалить текст из file1.txt .

Я помещаю текст в файл tmp и делаю:

grep -f tmp file.txt

Но это дает мне только разницу.

Вопрос в том, как убрать разницу из file.txt .

4 ответа4

7

Выполнение grep -f tmp file.txt отобразит все строки, содержащие рабочий text (предположим, что tmp просто ограничивает рабочий text). Если вы хотите отобразить все строки, которые не содержат текст слова, вам нужно использовать опцию -v чтобы инвертировать соответствие:

$ grep -v 'text' file.txt

Если вы печатаете все строки в файле, но просто удаляете все вхождения text тогда:

$ sed 's/text//g' 
4

Если вы хотите удалить строки из вашего file.txt который содержит строку, в которой text является семенем, вы можете сделать что-то вроде:

sed '/text/d' file.txt

или же

sed -n '/text/!p' file.txt
2

Что вы хотите сделать, это

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
0

Что я делаю, это:

sed '/text_to_delete/d' filename | sponge filename

Это внесет изменения в исходный файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .