使用花括号或循环时 sed 出现额外字符错误

发布于 2024-10-04 04:41:20 字数 785 浏览 4 评论 0原文

我目前正在编写一个批处理脚本来读取和修改 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'< /code> – 失败,sed: -e 表达式 #1, char 11: 命令后有额外字符

sed 's/^^ */^&\n/ :loop s/。 */asdf/ b Loop' – 因 sed: -e expression #1, char 12: Unknown option tos'` 失败,

我只是不确定我的 main 是否出错声明是由于我搞砸了语法,或者只是因为我在 Windows 中。您能提供的任何想法或帮助都会很棒。

I'm currently writing a batch script to read from and modify some configuration files in Windows. Thankfully, I have access to said, and as such I can use that for most of what I have to do, albeit with some quirks due to the environment.

The statement I'd like to execute is:

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

Which should theoretically remove any newlines on lines between lines with square brackets. I'm using double carets here to escape and use the second one (a quirk of cmd.exe). However it fails with the following error:

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

In testing some other other statements I've got the following results.

sed '/\[/{ s/.*//g }' – Executes exactly as it should

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

sed 's/^^ */^&\n/ :loop s/.*/asdf/ b loop' – Fails with sed: -e expression #1, char 12: unknown option tos'`

I'm just not sure whether my error with my main statement is due to me screwing up the syntax, or if it's just because I'm in Windows. Any thoughts or assistance you can provide would be wonderful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吾家有女初长成 2024-10-11 04:41:20

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

您需要在语句之间添加分号。另外,我使用“$”锚点而不是“^”,因为您永远不会匹配“/^]/”,因为您的“N”命令会更改模式空间以在“[”之前包含内容。请记住,“/ /”匹配模式空间,而不是当前输入行。

测试

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

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

You need to put semi-colons between your statements. Also, I used the '$' anchor instead of '^' because you'll never match '/^]/' because your 'N' command alters the pattern space to have stuff before the '['. Remember, '/ /' matches against the pattern space, not the current input line.

Test

$ echo -e 'A\n[\nfoo\nbar\nbaz\n]\nB' | sed '/\[$/{:loop; N;/]$/!b loop}; s/\n//g'
A
[foobarbaz]
B
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文