在使用大括号或循环时,使用sed时会出现额外的字符错误

我目前正在编写一个批处理脚本来读取和修改Windows中的一些configuration文件。 值得庆幸的是,我可以这样说,因此我可以用它来做我所要做的大部分工作,虽然由于环境而有些怪癖。

我想执行的声明是:

sed '/\[$/{:loop N /^^]/!b loop} s/\n//g' 

理论上应该删除带有方括号的行之间的任何换行符。 我在这里使用双脱字符转义和使用第二个( cmd.exe的怪癖)。 但是,它会失败,并出现以下错误:

 sed: -e expression #1, char 15: extra characters after command 

在testing一些其他的陈述,我有以下结果。

sed '/\[/{ s/.*//g }' – 执行完全按照它应该

sed '/\[/{ N } s/.*//g' – 不符合sed: -e expression #1, char 11: extra characters after command

sed 's/^^ */^&\n/ :loop s/.*/asdf/ b loop' – 与sed: -e expression #1, char 12: unknown option to失败sed: -e expression #1, char 12: unknown option to s'`

我只是不确定我的主要陈述的错误是由于我搞砸了语法,还是因为我在Windows中。 任何你可以提供的想法或帮助将是美好的。

sed '/\[$/{:loop; N;/]$/!b loop}; s/\n//g'

你需要在你的陈述之间放置分号。 另外,我使用的是'$'而不是'^',因为你永远不会匹配'/ ^] /',因为你的'N'命令改变了模式空间在'['之前。 请记住,'/ /'匹配模式空间 ,而不是当前的输入行。

测试

 $ echo -e 'A\n[\nfoo\nbar\nbaz\n]\nB' | sed '/\[$/{:loop; N;/]$/!b loop}; s/\n//g' A [foobarbaz] B