1

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

3 回答 3

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

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

于 2021-06-30T00:16:53.343 回答
1

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

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

于 2021-07-04T20:06:58.487 回答
1
perl -0777 -pe 's/^\s*\[\s*//; s/\s*\]\s*$//' file

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

于 2021-06-30T01:10:13.273 回答