替换行中的字符串

替换行中的字符串

我有这样的行:

    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   ####

相关内容