从文件中删除括号

时间:2021-06-29 22:49:57

标签: unix-text-processing

如何使用 bash 脚本(文件中第一次出现 { $pull: {"articles._id" : articleId } } 和最后一次出现 [)从文件中有效地删除括号? 所有嵌套在外括号内并可能延伸到多行的括号都应保留。 可能存在前导或尾随空格。

] 的内容

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

3 个答案:

答案 0 :(得分: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/...// 来删除它们。

答案 1 :(得分:1)

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

删除外括号周围的所有空白是一种积极的做法,这与您在所需的输出中显示的不完全相同。

答案 2 :(得分:1)

对于 -E-z 使用 GNU sed:

$ 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

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