3

次のようなテキストファイルがあります。

FOO BAR PIPPO PLUTO 31337 1010
FOOZ BAZ 130
VERY LONG LINE LIKE THIS THEN A NUMBER LIKE 42

私はそれを次のように変える必要があります:

FOO-BAR-PIPPO-PLUTO 31337 1010
FOOZ-BAZ 130
VERY-LONG-LINE-LIKE-THIS-THEN-A-NUMBER-LIKE 42

私にできる最善のことは次のとおりです。

sed -re 's/([A-Z]+)( )([A-Z]+)/\1-\3/g'

しかし、出力は

FOO-BAR PIPPO-PLUTO 31337 1010
FOOZ-BAZ 130
VERY-LONG LINE-LIKE THIS-THEN A-NUMBER LIKE 42

閉じますが、葉巻はありません。正規表現が機能しない理由について何か考えはありますか?

4

3 に答える 3

4

重複する一致を持つことはできません。「FOOBAR」とのマッチング時に「BAR」が既に消費されているため、「BARPIPPO」は検出されません。

FOO BAR PIPPO PLUTO 31337 1010
------- ===========
   1         2

代わりにこれを試してください:

$ sed -re 's/ ([A-Z])/-\1/g'

これには重複する一致がないことに注意してください。

FOO BAR PIPPO PLUTO 31337 1010
   --  ==    --
   1   2     3
于 2011-03-14T22:39:41.133 に答える
1
sed 's/ \([^0-9]\)/-\1/g'

スペースの後に数字ではないものを探し、そのスペースを。に置き換えて-ください。これの利点は、英数字以外の文字を含む行で機能することです。

コンセプトの証明

$ cat ./infile
FOO BAR PIPPO PLUTO 31337 1010
FOOZ BAZ 130
VERY LONG LINE LIKE THIS THEN A NUMBER LIKE 42
THIS LINE HAS $ODD$ #CHARS# IN %IT% 42

$ sed 's/ \([^0-9]\)/-\1/g' ./infile
FOO-BAR-PIPPO-PLUTO 31337 1010
FOOZ-BAZ 130
VERY-LONG-LINE-LIKE-THIS-THEN-A-NUMBER-LIKE 42
THIS-LINE-HAS-$ODD$-#CHARS#-IN-%IT% 42
于 2011-03-14T22:47:43.047 に答える
0

とても近い。ただし、複数の文字を一致させる必要はありません。文字スペース文字が必要なだけです。

sed -Ee 's/([A-Z])( )([A-Z])/\1-\3/g' foo.txt 
FOO-BAR-PIPPO-PLUTO 31337 1010
FOOZ-BAZ 130
VERY-LONG-LINE-LIKE-THIS-THEN-A NUMBER-LIKE 42

(BSD sed用に調整されたsedパラメータ)

于 2011-03-14T22:43:47.980 に答える