$ 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 -r
或sed -E
来启用扩展正则表达式,其中您不需要反斜杠任何这些字符。这些选项也是非标准的,但至少如果它们不受支持而不是神秘的失败,你会得到一个错误。这些选项被GNUsed
和所有主要的 BSD 衍生产品(FreeBSD、OpenBSD、NetBSD、OS X)支持,但在许多商业 Unix 版本中不支持。
如果您需要真正可移植的扩展正则表达式,请使用awk
,它总是使用它们。
你也必须转义加号+
:
$ echo "104_Fri" | sed 's/^\([0-9]\+\)_\([A-Za-z]\+\)$/\1;\2/'
104;Fri
Run Code Online (Sandbox Code Playgroud)
添加-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;星期五
...举出两个。
您也可以替换地址。你最终会使用更少的疯狂反斜杠。
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)