我有这样的行:
400 january ####
304 april ####
151 may ####
126 june ####
115 august ####
98 december ####
我希望它们看起来像这样:
#### january 400
#### april 304
#### may 151
#### june 126
#### august 115
#### december 98
我尝试使用这个命令,但没有成功。
sed -E 's/(.*)(.*)(.*) /\3 \2 \1/'
答案1
这是一种更简单的方法:
awk '{print $3," "$2," "$1}' file
它仅用于awk
打印第 3、2 和 1 列,在第三列和第二列之间有两个空格,在第二列和第一列之间有四个空格。
输出:
#### january 400
#### april 304
#### may 151
#### june 126
#### august 115
#### december 98
如果您希望它就地编辑文件,请使用以下命令:
awk -i inplace '{print $3," "$2," "$1}' file
答案2
尝试:
$ sed -E 's/^(.*[0-9])(.*[[:alpha:]])(.*)/\3 \2 \1/' file
#### january 400
#### april 304
#### may 151
#### june 126
#### august 115
#### december 98
怎么运行的
^(.*[0-9])
匹配从行的开头到行的最后一个数字。(.*[[:alpha:]])
匹配从上面的后面到该行的最后一个字母字符。(.*)
匹配该行最后一个字母字符之后的任何内容。
讨论
考虑:
sed -E 's/(.*)(.*)(.*) /\3 \2 \1/'
sed 的正则表达式匹配最左边最长的。这意味着(.*)
上面的第一个匹配整行。其余组为空。如果我们修改命令,这一点就会变得清晰:
$ sed -E 's/(.*)(.*)(.*) /3=\3 and 2=\2 and 1=\1/' file
3= and 2= and 1= 400 january ####
3= and 2= and 1= 304 april ####
3= and 2= and 1= 151 may ####
3= and 2= and 1= 126 june ####
3= and 2= and 1= 115 august ####
3= and 2= and 1= 98 december ####