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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

有任何想法吗?

答案

那这个呢?

$ 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打印连字符+捕获“任何不是直到行尾的空格”。
另一答案

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

-1
另一答案

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

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

为了您的输入,它产生:

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 变化:

awk
另一答案

以下也适用于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

以上是关于Sed - 替换每行的最后一次匹配的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本学习替换

sed如何在文件的最后 插入一行文字

linux下sed命令对文件执行文本替换

使用 sed/perl/awk 替换第一次出现的匹配文本

linux sed 替换

linux 替换 sed命令 转载