问题描述
如何使用 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
解决方法
如果要编辑文件以删除大括号,请使用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
删除外括号周围的所有空白是一种积极的做法,这与您在所需的输出中显示的不完全相同。
,对于 -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
以上将整个文件读入内存。