正确转义sed字符串

Chr*_*ieb 10 bash escaping sed

我有一个正则表达式和替换模式,已经在我的输入数据上使用Notepad ++进行了测试并正常工作.然而,当我将它们放入sed表达式时,没有任何东西可以匹配.

这是sed命令:

 # SEARCH = ([a-zA-Z0-9.]+) [0-9] (.*)
 # REPLACE = \2 (\1)

 sed -e 's/\([a-zA-Z0-9.]+\) [0-9] \(.*\)/\2 \(\1\)/g'
Run Code Online (Sandbox Code Playgroud)

以下是数据的抽样:

jdoe 1 Doe, John
jad 1 Doe, Jane
smith 2 Smith, Jon
Run Code Online (Sandbox Code Playgroud)

和期望的输出:

Doe, John  (jdoe)
Doe, Jane  (jad)
Smith, Jon (smith)
Run Code Online (Sandbox Code Playgroud)

我已经尝试删除并添加转义到sed表达式中的不同字符,但要么没有得到任何匹配或类似的东西:

sed: -e expression #1, char 42: invalid reference \2 on `s' command's RHS
Run Code Online (Sandbox Code Playgroud)

如何才能正确转义?

Mar*_*ers 17

我通常发现使用-r开关更容易,因为这意味着转义类似于大多数其他语言的转义:

sed -r 's/([a-zA-Z0-9.]+) [0-9] (.*)/\2 (\1)/g' file1.txt
Run Code Online (Sandbox Code Playgroud)


D.S*_*ley 9

对其他人已经说过的一些警告和补充:

  1. -r选项是GNU扩展,用于启用扩展正则表达式.-E相反,BSD导出了sed的使用.
  2. SedGrep使用Basic Regular Expressions
  3. Awk使用扩展正则表达式
  4. 如果要编写可移植脚本,makefile等,您应该熟悉POSIX规范,例如IEEE Std 1003.1.

我建议将表达式重写为

's/\([a-zA-Z0-9.]\{1,\}\) [0-9] \(.*\)/\2 (\1)/g'
Run Code Online (Sandbox Code Playgroud)

哪个应该在任何符合POSIX标准的情况下完全符合您的要求sed.如果您确实关心这些事情,请考虑定义POSIXLY_CORRECT环境变量.