【问题标题】:Getting Error sed: -e expression #1, char 5: unknown command: `0' [duplicate]出现错误 sed:-e 表达式 #1,字符 5:未知命令:`0' [重复]
【发布时间】:2015-04-27 03:48:52
【问题描述】:

我正在使用以下代码

      ff=`date +%h" "%Oe`
      pd=`date -d'yesterday' +%h" "%Oe`
      aa=`date -d'yesterday' +%d\/%m\/%Y`
      bb=`date +%d\/%m\/%Y`
      for j in `ls -lrt |egrep "$ff|$pd"|awk -F " " '{print $9}'`
      do
      sed -n "/${aa}/,/${bb}/p" ${j} 
      done

我从中获取数据的日志看起来像这样

      [2015-01-07 18:39:18,212] host123 WARN com.host123 .elf.UserQuest -  
      Quest/option {o.q.more.paper.osc#0} references unknown dependent   
      {t.what.form.file.more.action} in application {src-code}. Please            
      revise.

      [2015-01-07 18:39:18,212] host123 WARN com.host123 .elf.UserQuest -   
      Quest/option {o.q.more.paper.osc#1} references unknown dependent 
      {t.what.form.file.more.action} in application {src-code}. Please  
      revise.

      [2015-01-07 18:40:34,281] cessor32 ERROR com.host123 
      .email.DirectMailer -  Unable to connect to server {1.1.1.1}:
      javax.mail.MessagingException: Could not connect to SMTP host:  
      1.1.1.1, port: 25, response: 451
      at              
      com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:996)
      at  
  com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:197)
   at javax.mail.Service.connect(Service.java:233)
   at javax.mail.Service.connect(Service.java:134)
   at               
   com.host123.email.DirectMailer.deliverMessage(DirectMailer.java:191)

执行脚本后出现以下错误

   sed: -e expression #1, char 5: unknown command: `0'

请提出一些建议。

【问题讨论】:

  • 你应该避免使用过时的回抽,使用这样的括号:ff=$(date +%h" "%Oe)
  • @Jotne 感谢您的建议。你能告诉我在这个 ff=date +%h" "%Oe 中使用 back 的缺点吗?
  • 谷歌搜索或见她:stackoverflow.com/questions/9449778/…

标签: linux unix sed


【解决方案1】:

这里的问题是您在 sed 命令中使用了/ 分隔符,同时使用了包含相同字符的模式。尝试将您的 sed 命令更改为:

sed -n "\#${aa}\#,\#${bb}\#p" "$j"

正如NeronLeVelu在cmets中提到的(谢谢),有必要用反斜杠转义字符。

或者,您可以使用 awk 打印您的行范围:

awk -v s="$aa" -v e="$bb" '$0 ~ s, $0 ~ e' "$j" 

【讨论】:

  • \#${aa}#,\#${bb}# normaly (posix) 你需要在模式范围内转义第一个分隔符(不像 s### 那样将第一个字符作为分隔符)同时你明白了
  • @NeronLeVelu 谢谢,已编辑
  • @NeronLeVelu 在使用此命令sed -n "\#${aa}#,\#${bb}#p" file.txt 或此sed -n "\#${aa}\#,\#${bb}\#p" file.txt 时出现以下错误sed: -e expression #1, char 30: unterminated address regex
  • 由于双引号 '\#"\\# 尝试使用双转义
  • 能否在sed之前显示aa和bb的内容。在 AIX 和 linux 上测试可以工作
【解决方案2】:

问题是bb 的值包含/s(您的sed 命令也使用/ 作为分隔符)。尝试将行更改为:

sed -n "#${aa}#,#${bb}#p" ${j}

另一个建议是使用ff=$(date +%h" "%Oe)的新格式

【讨论】:

    【解决方案3】:

    尝试从ls -lrt |egrep "$ff|$pd"|awk -F " " '{print $9}' 中创建数组然后循环遍历数组?

    【讨论】:

    • 其实我以前用过这个" ls -lrt |egrep "$ff|$pd"|awk -F " " '{print $9}' ",但从来没有遇到过同样的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2019-03-17
    • 2021-06-26
    • 1970-01-01
    • 2013-03-08
    • 2014-04-06
    • 2020-11-25
    • 2018-04-25
    相关资源
    最近更新 更多