완벽한 sed 교체를 시도해보세요

완벽한 sed 교체를 시도해보세요

나는 sed 대체를 시도하고 있으며 현재 이를 수행하기 위해 두 개의 명령을 사용하고 있습니다. 이 두 명령을 결합하여 한 번에 단어를 올바르게 바꾸는 방법을 모르겠습니다.

여기서 내가 하는 일은 sc_admin단어가 있는 모든 곳에 추가하는 것입니다 admin.

제가 생각할 수 있는 모든 단어 조합은 다음과 같습니다.

access = read : [ admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin ]
access = read : [ admin, somerole ], write : [ admin, power ]

그래서 현재 교체를 수행하기 위해 2개의 sed 명령을 사용하고 있습니다.

sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *]/, sc_admin ]/' infile

읽기 부분에서는 admin이라는 단어를 올바르게 바꾸지만 쓰기 부분에서는 바꾸지 않습니다.

예를 들어

access = read : [ admin, sc_admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ *, sc_admin ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power ]
access = read : [ defadmin, somerole, sc_admin ], write : [ admin, power ]

하지만

 sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *] *$/, sc_admin ]/'

이 명령은 쓰기 부분에 admin이라는 단어를 올바르게 추가하고 읽기 부분에는 아무 작업도 수행하지 않습니다.

access = read : [ admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole ], write : [ admin, power, sc_admin ]
access = read : [ defadmin, somerole ], write : [ admin, power ]

그래서 현재 파일을 복구하기 위해 하나의 명령을 실행한 다음 두 번째 명령을 실행하고 있습니다. 올바른 출력을 얻을 수 있도록 명령을 결합하는 확실한 방법이 있습니까?

이것이 내가 원하는 실제 출력입니다.

access = read : [ admin, sc_admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power, sc_admin ]

답변1

다음 명령을 사용하여 다음 작업을 수행할 수 있습니다 sed.

$ sed 's/\(\[ admin[^]]*\) /\1, sc_admin /g' file 
access = read : [ admin, sc_admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power, sc_admin ]


  • \(\[ admin[^]]*\)문자열 '[admin<not]'과 마지막 공백>의 모든 문자를 캡처합니다. 이를 위해 , 사이에 포함된 문자를 캡처하여 ( ) ']' 가 아닌 문자를 선택하는 \(...\)데 사용합니다 .[^]]*^

  • \1, sc_admin캡처된 그룹( \1)으로 바꾸고 ",sc_admin"을 추가합니다.

관련 정보