行の文字列を置き換える

行の文字列を置き換える

私は次の行を持っています:

    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

awk3、2、1列のみを印刷し、3番目と2番目の列の間には2つのスペースがあり、2番目と1番目の列の間には4つのスペースがあります。

出力:

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

関連情報