小编use*_*574的帖子

sed表达式,char xx:由连字符引起的无效范围结束错误

给出一个文件:

2014-08-01 20:13:17.666 xxxxxxxxxx
2014-08-01 20:13:17.666 xxxxxxxxxx
2014-08-01 20:13:17.666 xxxxxxxxxx
......
Run Code Online (Sandbox Code Playgroud)

我试图使用sed删除微秒:

GNU sed version 4.2.1
Copyright (C) 2009 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)

以下是失败,错误消息"sed:-e expression#1,char 38:无效范围结束"

sed 's/\([0-9][0-9\- :]*\)\.[0-9]\{3\}/\1/g' < a.csv
Run Code Online (Sandbox Code Playgroud)

但是,vi a.csv和搜索

\([0-9][0-9\- :]*\)\.[0-9]\{3\}
Run Code Online (Sandbox Code Playgroud)

工作良好.

rootcause是转义的连字符.如果我删除了转义的连字符,sed将不会抱怨但它与预期的模式不匹配.我尝试过不同的方法来逃避连字符无济于事.

解决方法是明确写出整个日期时间格式,如下所示:

sed 's/\([0-9][0-9]*-[0-9][0-9]-[0-9][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]\)\.[0-9]\{3\}/\1/g'
Run Code Online (Sandbox Code Playgroud)

解决方法看起来很丑陋而且很麻烦.我确实认识到底层RE引擎在sed和vi之间是不同的.但是,我喜欢

  1. 明白为什么甚至逃脱连字符在sed失败
  2. 如何修改sed的RE以使其更优雅.

sed错误"无效范围结束"相关但未解决

regex unix bash sed

1
推荐指数
1
解决办法
1197
查看次数

scala:如何将匿名函数转换为 val

我是一个学习 scala 并研究匿名函数和值的初学者。我无法转换{case e if e % 2 == 0 => e}为 Val。我尝试了不同的语法(如下所示的示例)但无济于事。转换为 val 没有真正的目的;只是想获得更深入的了解。

package exercises.functions

object CollectVal extends App {
  println(List(1,2,3,4,5).collect{case e if e % 2 == 0 => e})
  //  val onlyEvens: Int = e:Int => Int = e if (e % 2 == 0 ) =>  e
  //  val onlyEvens = e:Int = {case e if e % 2 == 0 => e}
  println(List(1,2,3,4,5).collect{onlyEvens})
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏谢谢!

scala

1
推荐指数
1
解决办法
164
查看次数

标签 统计

bash ×1

regex ×1

scala ×1

sed ×1

unix ×1