sed 命令:如何同时查找和修改多个模式?

sed command: how to find and modify multiple patterns simultaneously?

我有一个问题需要用 bash 解决,尤其是 sed。 我的数据集是这样的:

James, L- PF 00
Jordan, M- PF 23
Bird, L- C 33

我需要这样结束:

uniform number for L. James: 00
uniform number for M. Jordan: 23

使用一个 sed 命令。

我最初的尝试是这样的:

sed -r 's/(.*), ([[:upper:]])- ([0-9]+)/uniform number for . : /' filename

但我似乎找不到数字部分的任何匹配项。我设法在早期版本中获得了名字字母和姓氏,但没有与数字结合...

有什么帮助吗?我做错了什么?

您似乎错过了 .* 来匹配 - 和数字之间的任何文本:

sed -r 's/(.*), ([[:upper:]])-.* ([0-9]+)/uniform number for . : /' nba_roster.txt
#                             ^^

您也可以使用

sed -E 's/^([^,]+), ([[:upper:]])[^0-9]*([0-9]+).*/uniform number for . : /' nba_roster.txt

参见 online demo:

#!/bin/bash
s='Sims, J- PF 45
Samanic, L- PF 91
Noel, N- C 3'
sed -E 's/^([^,]+), ([[:upper:]])[^0-9]*([0-9]+).*/uniform number for . : /' <<< "$s"

输出:

uniform number for J. Sims: 45
uniform number for L. Samanic: 91
uniform number for N. Noel: 3

图案详情

  • ^ - 字符串开头
  • ([^,]+) - 第 1 组 (</code>):逗号以外的任何一个或多个字符</li> <li><code>, - 逗号和 space
  • ([[:upper:]]) - 第 2 组 (</code>):大写字母</li> <li><code>[^0-9]* - 零个或多个 non-digit 个字符
  • ([0-9]+) - 第 3 组 (</code>):一位或多位数字</li> <li><code>.* - 字符串的其余部分(如果有的话)。

使用sed

sed 's/\([^,]*\), \([A-Z]\)[^0-9]*\(.*\)/uniform number for . : /' input_file
uniform number for J. Sims: 45
uniform number for L. Samanic: 91
uniform number for N. Noel: 3