我目前正在编写一个批处理脚本来读取和修改 Windows 中的一些配置文件。值得庆幸的是,我可以访问 said,因此我可以将它用于大部分我必须做的事情,尽管由于环境的原因会有一些怪癖。
我要执行的语句是:
sed '/\[$/{:loop N /^^]/!b loop} s/\n//g'
理论上应该删除带有方括号的行之间的行上的任何换行符。我在这里使用双插入符号来转义并使用第二个插入符号(cmd.exe
的怪癖)。但是它失败并出现以下错误:
sed: -e expression #1, char 15: extra characters after command
在测试其他一些语句时,我得到了以下结果。
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:
s'`
我只是不确定我的主语句的错误是由于我搞砸了语法,还是只是因为我在 Windows 中。如果您能提供任何想法或帮助,那就太好了。
最佳答案
sed '/\[$/{:loop; N;/]$/!b 循环}; s/\n//g'
您需要在语句之间放置分号。另外,我使用了“$” anchor 而不是“^”,因为你永远不会匹配“/^]/”,因为你的“N”命令改变了模式空间以在“[”之前有东西。请记住,'//' 匹配模式空间,而不是当前输入行。
测试
$ echo -e 'A\n[\nfoo\nbar\nbaz\n]\nB' | sed '/\[$/{:loop; N;/]$/!b loop}; s/\n//g'
A
[foobarbaz]
B
关于windows - 使用大括号或循环时 sed 出现额外字符错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4259271/