Sed - 替换每行的最后一次匹配

时间:2014-04-04 11:52:53

标签: regex sed

所以我有以下文件:

Carlton 3053
Carlton North 3054
Docklands 3008
East Melbourne 3002
Flemington 3031
Kensington 3031
Melbourne 3000
Melbourne 3004
North Melbourne 3051
St Kilda East 3183

我想用连字符替换数字前面的最后一个空格,这是我最接近的

cat file.txt | sed -r 's/\ /\-/g'

但这会用 - 替换所有空格 - 我希望输出看起来像这样:

Carlton-3053
Carlton North-3054
Docklands-3008
East Melbourne-3002
Flemington-3031
Kensington-3031
Melbourne-3000
Melbourne-3004
North Melbourne-3051
St Kilda East-3183

有什么想法吗?

5 个答案:

答案 0 :(得分:7)

这个怎么样?

$ sed -r 's/ ([^ ]*)$/-\1/' file
Carlton-3053
Carlton North-3054
Docklands-3008
East Melbourne-3002
Flemington-3031
Kensington-3031
Melbourne-3000
Melbourne-3004
North Melbourne-3051
St Kilda East-3183
  • ([^ ]*)$捕获空间+“任何不是空间直到行尾”。
  • -\1打印连字符+抓住的“任何不是直到行尾的空格”。

答案 1 :(得分:6)

你知道如何更换第一个空格,对吧?

rev inputfile | sed 's/ /-/' | rev

答案 2 :(得分:5)

你的尝试很接近。您只需要在空间之前捕获所有内容,并在替换中需要反斜杠引用。不知道你为什么逃过这个空间和连字符。

sed -r 's/(.*) /\1-/g' inputfile

对于您的输入,它会产生:

Carlton-3053
Carlton North-3054
Docklands-3008
East Melbourne-3002
Flemington-3031
Kensington-3031
Melbourne-3000
Melbourne-3004
North Melbourne-3051
St Kilda East-3183

答案 3 :(得分:3)

以下是awk变体:

awk '{$NF="-"$NF;sub(/ -/,"-")}1' file
Carlton-3053
Carlton North-3054
Docklands-3008
East Melbourne-3002
Flemington-3031
Kensington-3031
Melbourne-3000
Melbourne-3004
North Melbourne-3051
St Kilda East-3183

答案 4 :(得分:0)

由于sed -r在OSX上不可用,因此以下内容在OSX上也适用:

sed 's/\(.*\) /\1-/' file_containing_your_text.txt