удалить закрывающие скобки из файла

Как я могу эффективно удалить закрывающие скобки из файла с помощью сценария bash (первое появление [ и последнее появление ]в файле)? Следует сохранить все скобки, которые находятся внутри внешних скобок и могут занимать несколько строк. Могут присутствовать начальные или конечные пробелы.

содержание file1

      [
  Lorem ipsum
  [dolor] sit [amet
  conse] sadip elitr
]

cat file1 | magicCommand

желаемый результат

        Lorem ipsum
  [dolor] sit [amet
  conse] sadip elitr

содержание file2

        [Lorem ipsum [dolor] sit [amet conse] sadip elitr]

cat file2 | magicCommand

желаемый результат

        Lorem ipsum [dolor] sit [amet conse] sadip elitr

3 ответа

Если вы хотите отредактировать файл, убрав фигурные скобки, используйте ed:

      printf '%s\n' '1s/^\([[:space:]]*\)\[/\1/' '$s/\]\([[:space:]]*\)$/\1/' w | ed -s file1

Если вы хотите передать измененное содержимое файла чему-то другому как часть конвейера, используйте sed:

      sed -e '1s/^\([[:space:]]*\)\[/\1/' -e '$s/\]\([[:space:]]*\)$/\1/' file1

Оба они будут для первой строки файла удалить [ в начале строки (пропуская любой начальный пробел перед открывающей скобкой) и для последней строки файла (которая может быть той же строкой, что и во втором примере), удалите ]в конце строки (не считая конечных пробелов после закрывающей скобки). Любые начальные / конечные пробелы будут сохранены в результате; использовать s/...// вместо этого удалить их тоже.

      perl -0777 -pe 's/^\s*\[\s*//; s/\s*\]\s*$//' file

Это агрессивно по поводу удаления всех пробелов вокруг внешних скобок, что не совсем то, что вы показываете в желаемом выводе.

С GNU sed для -E а также -z:

      $ sed -Ez 's/\[(.*)]/\1/' file1

  Lorem ipsum
  [dolor] sit [amet
  conse] sadip elitr

      $ sed -Ez 's/\[(.*)]/\1/' file2
  Lorem ipsum [dolor] sit [amet conse] sadip elitr

Вышеупомянутое приведет к чтению всего файла в память.

Другие вопросы по тегам