удалите все строки из файла, начиная с «{» до «}», используя sed
Вопрос
У меня есть файл, содержимое которого такое:
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