【问题标题】:SED: Why does the replace do not work with $ to indicate end of the lineSED:为什么替换不能使用 $ 来指示行尾
【发布时间】:2019-11-16 04:03:11
【问题描述】:

我想使用 sed 从 c 头文件中删除特定的 cmets '//'。 我不明白为什么将 $ 放在最后不起作用。请建议。 请看下面的代码。

sed -i -e 's,\\(^//\\)\\(#undef TEST_FIRMWARE$\\),\2,' ./XX_HEADER.h

如果我在最后删除 $ 函数可以工作,但是当我放置 $ 时它不会。我想了解原因。

【问题讨论】:

  • 尝试检查这些行是否有肉眼看不到的字符,如空格、dos 样式的行尾等。您可以使用cat -tEcat -A 来检查
  • 当 Wiktor Stribiżew 添加四个前导空格以重新格式化您的 sed 时,编辑也应该将每个“\\”更改为“\”;我尝试进一步编辑您的帖子,但这对于 SO 来说太小了,无法接受;您能否进行编辑以修复sed 命令?谢谢

标签: regex sed


【解决方案1】:

我怀疑元字符的开头和结尾是否在捕获组中。试试:

sed -i -e 's,^\(//\)\(#undef TEST_FIRMWARE\)$,\2,' ./XX_HEADER.h

我的sed 版本似乎并不在意,但我确实知道我以前遇到过这种行为,所以这可能是影响你的sed 版本的原因。

【讨论】:

  • sed (GNU sed) 4.2.2 在我的机器上。将开头或结尾放在捕获组之外没有任何效果。
  • @sugun :在这种情况下,我倾向于同意 Sundeep 对您的问题的评论:接下来要检查的是尾随不可见(空格或非打印)字符; cat -A 可能会有所帮助,或者 od -c;这两个都会使不可见的字符/字节可见
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多