Как удалить строку из файла, когда строка содержит определенную строку?

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

например

123,aaa,bbb,888,8881 124,bbb,ccc,999,8881 125,ccc,ddd,888,8883 

Мне нужно удалить строку, содержащую 888.

3 Solutions collect form web for “Как удалить строку из файла, когда строка содержит определенную строку?”

Используя sed ,

 sed '/888/d' filename 

Вы можете использовать опцию -i для редактирования файла на месте, например,

 sed -i.bak '/888/d' filename 

Примечание: .bak будет сохранять резервную копию исходного файла.


Предполагая, что вы хотите избавиться от строк, которые содержат 888 по определенному столбцу, тогда вы хотели бы использовать,

 awk -F"," '$4 != "888"' filename 

Использование grep

 grep -vw '888' infile.csv > outfile.csv 

Если вы хотите редактировать inplace,

 sed -i.bak '/\b888\b/d' infile.csv 

Редактировать:

Чтобы удалить строки, содержащие 888 только в 4-м столбце

 sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv 

ИМО, используя команды printf для соединения в ed , лучше, чем sed -i .

 printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt 

Первый arg to printf сообщает ему распечатать каждый оставшийся аргумент, разделенный символами новой строки ( \n ).

Ни один из последних двух аргументов не нуждается в цитировании. Я просто привел их в качестве примера – некоторые команды ed нужно будет процитировать.


Почему лучше, чем sed -i ?

В отличие от ed , sed -i не выполняет правдивое редактирование на месте. Он создает временный выходной файл и затем переименовывает его поверх оригинала. У этого есть два потенциально нежелательных побочных эффекта:

  • Разрешения на файл могут измениться из-за umask с которым был создан файл temp. Даже право собственности или группа могут измениться, если сценарий sed -i запускается другим пользователем (у которого, конечно же, есть соответствующий RW-доступ к файлу и директории).

  • Файл замены будет иметь другой индекс. Это сломает жесткие ссылки.

  • Как получить разницу в уровне персонажа с помощью команды «diff» в Linux с помощью сценария оболочки?
  • команда find с несколькими шаблонами, не возвращающими никакого вывода
  • Чтение столбцов из файла, затем столбец в exsisting CSV-файл
  • BASH: массив как строковый буфер
  • Обнаруживать, если переменная пуста
  • Установите переменные переменных переменных в bash (или другие)
  • Обнаружение и удаление пустых каталогов из списка
  • Используя sed с herestring (<<<) и прочитайте -a
  • Проблема с передачей параметров, содержащих пробелы и символы wild card
  • передача результатов команды awk в качестве параметра
  • Как проверить, установлен ли mysql с помощью сценария bash?
  • Linux и Unix - лучшая ОС в мире.