使用 sed 正则表达式分组替换字符

mol*_*lok 3 regex grouping backreference sed

我有一个像这样的文本文件:

FOO BAR PIPPO PLUTO 31337 1010
FOOZ BAZ 130
VERY LONG LINE LIKE THIS THEN A NUMBER LIKE 42
Run Code Online (Sandbox Code Playgroud)

我需要把它变成:

FOO-BAR-PIPPO-PLUTO 31337 1010
FOOZ-BAZ 130
VERY-LONG-LINE-LIKE-THIS-THEN-A-NUMBER-LIKE 42
Run Code Online (Sandbox Code Playgroud)

我能做的最好的事情是:

sed -re 's/([A-Z]+)( )([A-Z]+)/\1-\3/g'
Run Code Online (Sandbox Code Playgroud)

但输出是

FOO-BAR PIPPO-PLUTO 31337 1010
FOOZ-BAZ 130
VERY-LONG LINE-LIKE THIS-THEN A-NUMBER LIKE 42
Run Code Online (Sandbox Code Playgroud)

接近,但没有雪茄。知道为什么我的正则表达式不起作用吗?

Mar*_*ers 5

你不能有重叠的匹配。未检测到“BAR PIPPO”,因为在匹配“FOO BAR”时“BAR”已被消耗。

FOO BAR PIPPO PLUTO 31337 1010
------- ===========
   1         2
Run Code Online (Sandbox Code Playgroud)

试试这个:

$ sed -re 's/ ([A-Z])/-\1/g'
Run Code Online (Sandbox Code Playgroud)

请注意,这没有重叠的匹配:

FOO BAR PIPPO PLUTO 31337 1010
   --  ==    --
   1   2     3
Run Code Online (Sandbox Code Playgroud)