从文件中删除括号

remove enclosing brackets from a file

如何使用 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

如果要编辑文件以删除大括号,请使用 ed:

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

如果您想将文件的修改内容作为管道的一部分传递给其他东西,请使用 sed:

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

对于文件的第一行,这两个都将删除行首的 [(跳过左大括号之前的任何初始空格),对于文件的最后一行文件(可以与第二个示例中的行相同),删除行尾的 ] (不计算右括号后的任何尾随空格)。结果中将保留任何 leading/trailing 空格;也使用 s/...// 来删除它们。

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

删除外括号周围的 所有 空格是激进的,这与您在所需输出中显示的内容不完全相同。

使用 GNU sed 用于 -E-z:

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

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

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

以上将整个文件读入内存。