フィールドを見つけて行末の前に移動します。

フィールドを見つけて行末の前に移動します。

次の行がありますが、「ABCD」を含むフィールドを見つけて、行の最後のフィールドの前に移動したいと思います。

string1;string2;xxxABCDxxx;string3;string4;string5;string6

出力

string1;string2;string3;string4;string5;xxxABCDxxx;string6

答え1

sed 's/\([^;]*ABCD[^;]*;\)\(.*;\)/\2\1/' <in >out

これはトリックを行う必要があります。

それだけに適用されます最初仕事が起こるABCDしかし。行に複数がある場合、残りはすべてスキップされます。

最後のセミコロンを;スラッシュに置き換えるには、わずかに変更するだけです。

sed 's|\([^;]*ABCD[^;]*\);\(.*;\)|\2\1/|' <in >out

答え2

sedに依存しない場合:

awk -v pattern="ABCD" '
    BEGIN { FS = OFS = ";" }
    {
        # find the first field containing the string
        for (i=1; i<NF; i++) if ($i ~ pattern) break

        # alter the last field to the desired contents
        $NF = $i "/" $NF

        # shift each subsequent field one place
        for (;i<NF; i++) $i = $(i+1)

        # reset the number of fields
        NF--

        # and output the new line
        print
    }
' filename

関連情報