удалите все строки из файла, начиная с «{» до «}», используя sed

StackOverflow https://stackoverflow.com//questions/10649516

  •  11-12-2019
  •  | 
  •  

Вопрос

У меня есть файл, содержимое которого такое:

control_data {
some data dadadadf 
some data fsfsfs
some more data
.
.
.
}
more data below 
{
.
.
}

Я хочу удалить данные из «control_data» до первого «}»

Я попробовал команду

sed "s/control_data\([^}]*\)}//g"

но это работает только в том случае, если у нас нет нескольких строк, например.эта команда работает, когда у нас есть такие данные, как:

control_data {some data dadadadf some data fsfsfs some more data...}more data

Это дает :

more data {....} 

Как заставить эту команду работать, если у нас есть данные в нескольких строках?Я новичок в написании сценариев оболочки, некоторые объяснения с ответом очень помогут.

Заранее спасибо.

Это было полезно?

Решение

Это не может быть идеальным, но это использовало SED (ваш код SED)

cat ip_file.txt | tr '\n' ':' | sed "s/control_data\([^}]*\)}//g" | tr ':' '\n'
.

Логика: Я преобразую все новые строки в: а затем, используя код Sed Code, а затем преобразовывать все: в Newlines Примечание. Мое предположение: не будет присутствовать в файле в любом месте.

Другие советы

Моя Седи-Фу слабая, но вот что я работал (используя Этот ответ в качестве руководства):

[me@home]$ sed -n '/^control_data {/{:a;n;/^}/!ba;n};p' input_file.txt
more data below 
{
.
.
}
.

Вот поломка команды

sed -n "             # "-n" = suppress automatic printing of pattern space
/^control_data {/ {  # if (line matches control data)
   :a;                 #   mark this spot with label a
   n;                  #   get next line
   /^}/!ba             #   if (doesn't start with "}") go back to label a
   n;                  #   get next line before leaving this control block
};                   # end if
p;                   # print everything else not affected by previous block
" input_file.txt
.

Это может сработать для вас:

sed '/^control_data {.*}$/d;/^control_data {/,/^}$/d' file
  • Первая команда удаляет все отдельные строки /^control_data {.*}$/d
  • Вторая команда удаляет все блоки /^control_data {/,/^}$/d
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top