【问题标题】:Having an extra characters error with sed when using curly braces or loops使用花括号或循环时 sed 出现额外字符错误
【发布时间】:2010-11-23 18:06:32
【问题描述】:

我目前正在编写一个批处理脚本来读取和修改 Windows 中的一些配置文件。谢天谢地,我可以使用它,因此我可以将它用于我必须做的大部分事情,尽管由于环境而有些怪癖。

我要执行的语句是:

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: unknown option tos'` 失败

我只是不确定我的主要语句的错误是由于我搞砸了语法,还是仅仅因为我在 Windows 中。您能提供的任何想法或帮助都会很棒。

【问题讨论】:

  • 我同意 SiegeX。 +1 包括所有相关信息(特别是双克拉和您使用 cmd.exe 的事实)。

标签: windows regex unix sed cmd


【解决方案1】:

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

【讨论】:

  • 第一种工作(它没有失败,但它删除了所有换行符而不是括号之间的换行符。第二个刚刚打印了“-e '[\nfoo\nbar\ nbaz\n]'" 这很奇怪。但是克服错误真是太棒了。非常感谢!
  • 天哪,它有效!只需要改变几件事。言语无法表达我的兴奋或感激之情。
  • 言语无法表达我的兴奋或感激之情。愿你过着充满赞成票的漫长而可爱的生活。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2017-11-26
  • 1970-01-01
  • 2015-01-14
  • 2015-04-28
  • 2013-06-20
相关资源
最近更新 更多