好的,所以我想将所有数字从线的末端移到线的前面,例如线条:
example123
example321
example2920
预期产出:
123example
321example
2920example
以下sed命令用于在开头到结尾放置数字 -
sed -E 's/^([0-9]+)(.*)/\2\1/' file
输入
123example
321example
,输出
example123
example321
但是当试图对最后移到前面的数字做同样的事情我似乎无法做到这一点..
我尝试过更改
^
到
$
和其他东西,但我是sed的新手,所以我真的不太了解。
答案 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