找到一个字段并将其移动到行尾之前

找到一个字段并将其移动到行尾之前

我有以下行,我想找到包含“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

相关内容