仅替换 sed 中匹配模式的一部分

geo*_*SCI 10 bash regex sed

对于具有相同结构的数万行,我想(例如)从这里开始:

abcd 12345 qwerty asdfg
Run Code Online (Sandbox Code Playgroud)

...到这里:

abcd 12345,qwerty asdfg
Run Code Online (Sandbox Code Playgroud)

...和

sed 's/[0-9]\ [A-Z]/,/g'
Run Code Online (Sandbox Code Playgroud)

我可以匹配 rigth 空间加上其周围的字符 (5 q),但在替换中我得到(显然):

abcd 1234,werty asdfg
Run Code Online (Sandbox Code Playgroud)

另外,我更喜欢在 linux shell 中执行此操作

我怎么能只匹配和替换每一行前面有一个数字后跟一个字母的空格?你会建议我使用另一种工具(甚至方法)来完成这项工作吗?

Joh*_*024 14

尝试:

$ echo 'abcd 12345 qwerty asdfg' | sed -E 's/([[:digit:]]) ([[:alpha:]])/\1,\2/g'
abcd 12345,qwerty asdfg
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 我们添加-E了扩展正则表达式语法。

  2. [:digit:][:alpha:]用于代替Unicode0-9A-Z确保 Unicode 安全。

  3. Parens 用于创建组,我们可以在替换文本中引用。在我们的例子中,\1引用数字并\2引用字母。

  • 这是对解决方案各个部分的非常清晰的解释。 (2认同)