相关疑难解决方法(0)

sed错误:"s'命令的RHS上的无效引用\ 1"

我运行几个替换命令作为mavencolorize脚本的核心.其中的sed命令,使用正则表达式,在shell工作发现这里讨论.可以在此处找到当前(不工作)的实现.

当我将该命令的一个变体包含到脚本中时,会发生不同的行为:

变式1:

$ sed -re "s/([a-zA-Z0-9./\\ :-]+)/\1/g"
Run Code Online (Sandbox Code Playgroud)

适应脚本:

-re "s/WARNING: ([a-zA-Z0-9./\\ :-]+)/${warn}WARNING: \1${c_end}/g" \
Run Code Online (Sandbox Code Playgroud)

错误: shell输出的信息与我输入的信息相同$ sed.奇怪!?


变式2:

$ sed -e "s/\([a-zA-Z0-9./\\ :-]\+\)/\1/g"
Run Code Online (Sandbox Code Playgroud)

适应脚本:

-e "s/WARNING: \([a-zA-Z0-9./\\ :-]\+\)/${warn}WARNING: \1${c_end}/g" \
Run Code Online (Sandbox Code Playgroud)

错误:

sed:-e表达式#7,char 59:`s'命令的RHS上的引用\ 1无效

regex sed substitution

85
推荐指数
4
解决办法
7万
查看次数

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
查看次数

标签 统计

regex ×2

sed ×2

bash ×1

substitution ×1

unix ×1