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

问题描述 投票:4回答:5

所以我有以下文件:

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

有任何想法吗?

regex sed
5个回答
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
  • ([^ ]*)$捕获空间+“任何不是直到行尾的空间”。
  • qazxsw poi打印连字符+捕获“任何不是直到行尾的空格”。

6
投票

你知道如何更换第一个空间,对吗?

-\1

5
投票

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

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

为了您的输入,它产生:

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

3
投票

这是一个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 变化:

awk

0
投票

以下也适用于OSX,因为那里没有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

sed -r
© www.soinside.com 2019 - 2024. All rights reserved.