一致する正規表現にサフィックスを追加する

一致する正規表現にサフィックスを追加する

最初のフィールドに数字を含む行があります。

46066.874.89
48569.123.56
56489.256.88
654.12.32
84689.25.69

今やりたいことは、004行目の末尾に654ファイルを追加し、1行目の前に3番目の数字を追加することです.。どうすればいいですか?使ってみよう

sed 's/^[0-9][0-9][0-9]./&00/'

しかし、私が得た結果は

4606006.874.89
4856009.123.56
5648009.256.88
654.0012.32
8468009.25.69

答え1

ほぼすべて来ました:

$ sed -E 's/^([0-9][0-9][0-9])\./\100./' file 
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

答え2

コマンドsedは3桁の数字の後に2つのゼロを挿入し、各行の先頭に別の文字を挿入します。 「すべての文字」と一致します.\.実際のポイントと一致させるためにポイントをエスケープしましたが、ゼロが2つ挿入されます。後ろに指す。

少しだけ調整すると問題が解決します。

$ sed 's/^\([0-9]\{3\}\)\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

または、sed拡張正規表現をサポートする場合(最近はほとんどサポート):

$ sed -E 's/^([0-9]{3})\./\100./' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

より一般的に使用awkしてください。

$ awk -F . 'BEGIN { OFS=FS } length($1) < 5 { $1 = sprintf("%s%.*d", $1, 5 - length($1), 0) }; 1' file
46066.874.89
48569.123.56
56489.256.88
65400.12.32
84689.25.69

awk長さが5文字未満の最初の点で区切られた列の各項目に対して、このコマンドは文字列の合計長が5文字になるように文字列を必要な数のゼロで埋めます。

これは、整数を欠けている長さのゼロで埋められた文字列にフォーマットすることによって0行われます。次に、そのフィールドの既存のデータと結合します。

これは、最初のフィールドのすべての短い文字列(たった3つの文字を含む文字列ではない)に適用されます。

文字列の先頭をゼロで埋める方が簡単です(必須ではありませんが、許可されています)。

$ awk -F . 'BEGIN { OFS=FS } { $1 = sprintf("%.5d", $1) }; 1' file
46066.874.89
48569.123.56
56489.256.88
00654.12.32
84689.25.69

最初のフィールドに整数が含まれているという事実を活用し、それをsprintf()正しい幅のゼロで埋められた整数にフォーマットします。

両方のコマンドの1末尾にあるコマンドは、現在行を印刷するデフォルトのジョブを呼び出します({ print }またはで置き換え可能{ print $0 })。

関連情報