sed / bash将数字从行尾移到行前面

时间:2018-03-17 21:46:57

标签: bash awk sed

好的,所以我想将所有数字从线的末端移到线的前面,例如线条:

example123
example321
example2920

预期产出:

123example
321example
2920example

以下sed命令用于在开头到结尾放置数字 -

sed -E 's/^([0-9]+)(.*)/\2\1/' file

输入

123example
321example

,输出

example123
example321

但是当试图对最后移到前面的数字做同样的事情我似乎无法做到这一点..

我尝试过更改

^

$

和其他东西,但我是sed的新手,所以我真的不太了解。

2 个答案:

答案 0 :(得分:3)

您提供的工作示例匹配"一串数字,后跟任何"。你可能认为你可以改变它以匹配"任何后跟一些数字的东西" (/\(.*\)\([0-9]*\) /),但问题是sed匹配尽可能多;在工作示例中,它尽可能多地抓取数字,并且在天真的新版本中,它会在第一个术语中抓取所有内容。

诀窍是匹配非数字后跟任何

sed 's/\([^0-9]*\)\(.*\)/\2\1/' filename

编辑:我没有想到 - 跟踪数字的可能性。这样:

sed 's/\(.*[^0-9]\)\(.*\)/\2\1/' filename

将转为

Ex1am2ple123

123Ex1am2ple

答案 1 :(得分:1)

使用GNU awk,你可以匹配尾随数字,然后打印它,输入的子字符串,最后切掉匹配的字符数:

awk 'match($0, /[0-9]+$/, m) {print m[0] substr($0, 0, length($0) - length(m[0]))}' file

即使前缀中有数字,此解决方案仍然有效,例如:

$ cat file
ex456le123
456mple321
example2920
$ gawk 'match($0, /[0-9]+$/, m) {print m[0] substr($0, 0, length($0) - length(m[0]))}' file
123ex456le
321456mple
2920example