这个 sed 表达式有什么问题?

Raf*_*ael 6 sed

$ echo "104_Fri" | sed 's/^\([0-9]+\)_\([A-Za-z]+\)$/\1;\2/'
104_Fri
Run Code Online (Sandbox Code Playgroud)

我想匹配开头的数字和结尾的字母 - 每个作为一个组。之后我想输出第一组,一个分号,然后是第二组。

我希望这个表达式产生:

104;Fri
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?

Mic*_*mer 11

反斜杠+

$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri
Run Code Online (Sandbox Code Playgroud)

请注意,这+不是标准的基本正则表达式元字符,因此sed即使在反斜杠时也没有可移植的行为。

您应该使用sed -rsed -E来启用扩展正则表达式,其中您不需要反斜杠任何这些字符。这些选项也是非标准的,但至少如果它们不受支持而不是神秘的失败,你会得到一个错误。这些选项被GNUsed和所有主要的 BSD 衍生产品(FreeBSDOpenBSDNetBSDOS X)支持,但在许多商业 Unix 版本中不支持。

如果您需要真正可移植的扩展正则表达式,请使用awk,它总是使用它们

  • 当然,如果必须使用 `sed` 的可移植子集,`x+` 很容易改写为 `xx*`。 (2认同)

cuo*_*glm 7

你也必须转义加号+

$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri
Run Code Online (Sandbox Code Playgroud)


Han*_*nnu 6

添加-r选项 ;-) 用于扩展正则表达式,并且对\活动内容的需求减少了。

$ echo "104_Fri" | sed -re 's/^([0-9]+)_([A-Za-z]+)$/\1;\2/'
104;星期五

随着 Q 的写入,(无背景数据)拆​​分任务可以通过其他几种更简单的方式完成:

$ echo "104_Fri" | tr '_' ';'
104;星期五

$ echo "104_Fri" | sed 's/_/;/'
104;星期五

...举出两个。


mik*_*erv 5

您也可以替换地址。你最终会使用更少的疯狂反斜杠。

sed -n '/._./{/^[0-9]*.[A-Za-z]*$/s/_/;/p;}'

sed -n '/[^0-9].*_.*[^A-Za-z]/d;/._./s/_/;/p'
Run Code Online (Sandbox Code Playgroud)