필드를 찾아서 줄 끝 앞으로 이동하세요.

필드를 찾아서 줄 끝 앞으로 이동하세요.

다음 행이 있는데 "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

관련 정보