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

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

1333
задан 23 марта '11 в 22:46
источник поделиться
14 ответов

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

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
2004
ответ дан 23 марта '11 в 22:48
источник

существует много других способов удаления строк со специальной строкой, кроме 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 
527
ответ дан 24 марта '11 в 2:57
источник

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

например.

sed -i '/pattern/d' filename      

или

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

Первая команда в 3 раза больше времени на моей машине.

191
ответ дан 02 нояб. '12 в 5:37
источник

Легкий способ сделать это с помощью GNU sed:

sed --in-place '/some string here/d' yourfile
52
ответ дан 02 янв. '15 в 20:56
источник

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

ex +g/match/d -cwq file

где:

  • + выполняет заданную команду Ex (man ex), то же, что и -c, которая выполняет wq (write and quit)
  • g/match/d - команда Ex для удаления строк с заданным match, см. Сила g

Вышеприведенный пример - POSIX-совместимый метод для редактирования файла на месте в соответствии с этой записью на Unix.SE и POSIX для ex.


Разница с sed заключается в следующем:

sed - S tream ED итор, а не редактор файлов. BashFAQ

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

25
ответ дан 17 окт. '15 в 14:54
источник

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

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

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

13
ответ дан 09 марта '16 в 18:39
источник

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

echo "$(grep -v "pattern" filename)" >filename
12
ответ дан 13 июня '15 в 22:24
источник

Я сделал небольшой тест с файлом, который содержит приблизительно 345 000 строк. В этом случае способ с grep в этом случае примерно в 15 раз быстрее, чем метод sed.

Я пробовал как с установкой LC_ALL = C, так и без нее, похоже, что изменения существенно не изменяются. Строка поиска (CDGA_00004.pdbqt.gz.tar) находится где-то посередине файла.

Вот команды и тайминги:

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
10
ответ дан 19 марта '17 в 15:45
источник

Вы также можете использовать это

 grep -v 'pattern' filename

здесь -v будет печатать только за исключением вашего шаблона (это означает инверсное совпадение)

7
ответ дан 28 марта '15 в 10:11
источник

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

2
ответ дан 17 сент. '16 в 2:51
источник
perl -i    -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3

Первая команда редактирует файл inplace (-i).

Вторая команда выполняет то же самое, но сохраняет копию или резервную копию исходного файла (ов), добавляя.bk к именам файлов (.bk можно изменить на что угодно).

2
ответ дан 30 июня '14 в 17:59
источник
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
0
ответ дан 31 мая '18 в 14:59
источник

На всякий случай кто-то хочет сделать это для точных совпадений строк, вы можете использовать флаг -w в grep, w для целого. То есть, например, если вы хотите удалить строки с номером 11, но сохраните строки с номером 111:

-bash-4.1$ head file
1
11
111

-bash-4.1$ grep -v "11" file
1

-bash-4.1$ grep -w -v "11" file
1
111

Также работает с флагом -f, если вы хотите исключить сразу несколько точных шаблонов. Если "черный список" - это файл с несколькими шаблонами в каждой строке, которые вы хотите удалить из "файла":

grep -w -v -f blacklist file
0
ответ дан 02 марта '17 в 13:45
источник

Другие вопросы по меткам или Задайте вопрос