удалить закрывающие скобки из файла
Как я могу эффективно удалить закрывающие скобки из файла с помощью сценария 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
Вышеупомянутое приведет к чтению всего файла в память.