【问题标题】:Why doesn't this SED command work?为什么这个 SED 命令不起作用?
【发布时间】:2013-07-10 07:25:01
【问题描述】:

我正在尝试用空字符串替换与模式.*q=HTTP 匹配的行中的所有字符串。

我正在使用以下命令。

sed s/.\*q=\|HTTP.*//  

但这不起作用。它不会用空字符串替换字符串。如果上面的命令有什么问题,请告诉我。

【问题讨论】:

  • 您能给我们提供字符串示例吗?问题可能来自外壳扩展。

标签: linux unix sed gnu


【解决方案1】:

这条线应该可以满足您的要求:

sed s'/\.\*q=\|HTTP//g'

例如:

kent$  echo "leave.*q=justHTTP foo"|sed s'/\.\*q=\|HTTP//g'        
leavejust foo

你的命令:

  • sed 命令中更好的引用表达式
  • 如果您想替换所有出现的模式,在您的情况下是 .*q 或 HTTP,您需要在 s/../../ 中添加一个 g 标志
  • 如果您只想替换HTTP,则不应在其末尾添加.*,否则它将包含HTTP 后的所有字符串。
  • 如果要匹配文献字符串.*,则需要转义. *

【讨论】:

  • 在应用上述过滤器后,如何将其更改为仅匹配超过 3 个字符的行?
  • @bourne 你想 1step 在所有行上应用替换,2step,用length>=3 输出行?如果你想要这个,你可以将 sed 输出通过管道传送到sed ...|awk 'length>=3',两个步骤可以由 awk 单独由 awk 的gsub 完成。但它不适合你原来的问题。
  • 是的,我想要第二步输出长度>=3。谢谢
  • 是的,谢谢它的工作。我有一个查询。为什么一定要转义'|'但不是“*”或“。”在 sed 正则表达式中?
  • @bourne . * and | 都被转义了。你看过我回答中的代码了吗?
最近更新 更多