Вопрос: Удалить строки в текстовом файле, который содержит определенную строку


Как использовать sed для удаления всех строк в текстовом файле, который содержит определенную строку?


1280


источник


Ответы:


Чтобы удалить строку и распечатать вывод до стандартного:

sed '/pattern to match/d' ./infile

Чтобы напрямую изменить файл:

sed -i '/pattern to match/d' ./infile

Чтобы напрямую изменить файл (и создать резервную копию):

sed -i.bak '/pattern to match/d' ./infile

Для пользователей Mac OS X:

sed -i '' '/pattern/d' ./infile

1909



существует много других способов удаления строк с определенной строкой, кроме sed

AWK

awk '!/pattern/' file > temp && mv temp file

Ruby (1.9+)

ruby -i.bak -ne 'print if not /test/' file

Perl

perl -ni.bak -e "print unless /pattern/" file

Shell (bash3.2 +)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o 
mv o file

GNU grep

grep -v "pattern" file > temp && mv temp file

и, конечно же, sed(печать инверсии происходит быстрее, чем фактическое удаление).

sed -n '/pattern/!p' file 

518



Вы можете использовать sed для замены строк на месте в файле. Тем не менее, это выглядит намного медленнее, чем использование grep для инверсии во второй файл, а затем перемещение второго файла поверх оригинала.

например

sed -i '/pattern/d' filename      

или

grep -v "pattern" filename > filename2; mv filename2 filename

В любом случае, первая команда в три раза больше на моей машине.


185



Простой способ сделать это, с GNU sed:

sed --in-place '/some string here/d' yourfile

49



Вы можете использовать ex(который является стандартным командным редактором UNIX):

ex +g/match/d -cwq file

где:

  • +выполняет заданную команду Ex ( man ex), такой же как -cкоторый выполняет wq(написать и выйти)
  • g/match/d- команда Ex для удаления строк с данными match, видеть: Мощность g

Вышеприведенный пример - POSIX-совместимый метод для редактирования файла на месте в соответствии с этим сообщение в Unix.SE а также Спецификации POSIX для ex,


Разница с sedв том, что:

sedэто S Tream ED itor, а не редактор файлов. BashFAQ

если вы не пользуетесь незарегистрированным кодом, накладными расходами ввода-вывода и некоторыми другими плохими побочными эффектами. Таким образом, в основном некоторые параметры (например, на месте / -i) являются нестандартными расширениями FreeBSD и могут быть недоступны в других операционных системах.


24



Чтобы получить такой результат, как grepвы можете сделать это:

echo "$(grep -v "pattern" filename)" >filename

12



Я боролся с этим на Mac. Кроме того, мне нужно было сделать это с помощью замены переменных. Поэтому я использовал:

sed -i '' "/$pattern/d" $file

где $fileфайл, в котором требуется удаление; $patternэто шаблон, который следует сопоставить для удаления. Выбрал ''из этого комментарий , Здесь следует отметить использование двойные кавычки в "/$pattern/d", Переменная не работает, когда мы используем одиночную кавычку.


12



I have made a small benchmark with a file which contains approximately 345 000 lines. The way with grep seems to be around 15 times faster than the sed method in this case.

I have tried both with and without the setting LC_ALL=C, it does not seem change the timings significantly. The search string (CDGA_00004.pdbqt.gz.tar) is somewhere in the middle of the file.

Here are the commands and the timings:

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

9



SED:

AWK:

GREP:


8



You can use this also

 grep -v 'pattern' filename

here -v will print only other than your pattern(that means Invert match)


7



echo -e "/thing_to_delete\ndd\033:x\n" | vim file_to_edit.txt


2



perl -i    -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3

The first command edits the file(s) inplace (-i).

The second command does the same thing but keeps a copy or backup of the original file(s) by adding .bk to the file names (.bk can be changed to anything).


2