【问题标题】:What is wrong here with sed?sed 有什么问题?
【发布时间】:2014-07-04 00:07:37
【问题描述】:

已经在 sed 和 gsed 上花费了很多时间,只是尝试匹配一个愚蠢的字符串,但它仍然不起作用!

两者都没有:

echo "123adv123" | sed -En 's/\([a-z]+\)/#/g'

也不:

echo "123adv123" | sed -En 's/([a-z]*)/#/g'

也不:

echo "123adv123" | sed -En 's/([a-z]+)/#/g'

也不:

echo "123adv123" | gsed -rn 's/\([a-z]+\)/#/g'

也不:

echo "123adv123" | gsed -rn 's/([a-z]+)/#/g'

我正在 OSX 上尝试它。我知道这个问题看起来很奇怪,但我卡住了,只是想弄明白这里有什么问题?

输出应该是123#123

【问题讨论】:

  • 你想达到什么目的?你能提供预期的输出吗?
  • 您从未打印过图案空间。你永远不会得到任何输出。删除 n 参数。或者,在 g 之后添加 p 以告诉 sed 打印该行。您的最后一行在 CentOS linux 上使用 GNU sed version 4.1.5 有效(使用 s/gsed/sed/ 并删除 n 参数)。
  • 删除-n ("noprint") 参数,或在您的s 命令中添加p ("print"):s/a/b/gp
  • 谢谢,抱歉这个愚蠢的问题,只是以一种奇怪的方式坚持下去。

标签: regex bash sed


【解决方案1】:

您需要删除-n 否则会抑制输出。

这适用于 OSX:

echo "123adv123" | sed 's/\([a-z][a-z]*\)/#/g'

是这样的:

echo "123adv123" | gsed -r 's/([a-z]+)/#/g'

或者这个:

echo "123adv123" | sed -E 's/([a-z]+)/#/g'

或仅打印替换行使用:

sed -nE 's/([a-z]+)/#/pg' file

【讨论】:

  • 我以为是为了抑制不匹配的行。好的,如果我删除它,我将如何抑制没有匹配的行?
  • 您可以使用:sed -nE 's/([a-z]+)/#/pg' file
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2013-04-11
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多