괄호와 함께 sed를 사용하는 방법은 무엇입니까?

괄호와 함께 sed를 사용하는 방법은 무엇입니까?

여러 개의 .php파일이 있고 문자열이 있는 모든 항목을 바꾸고 싶습니다.

find: jQuery(function
replace: head.ready(function

나는 다음을 사용하여 올바르게 수행하고 있다고 생각합니다.

find . -name '*.php' -exec sed -e 's/jQuery[(]function/head.ready[(]function/g' -i'.bak' {} \;

결국 일어나는 일은 다음 jQuery(function으로 대체된다는 것입니다.head.ready[(]function

(막으면 도망갈 수 있을 거라 생각했는데 []그게 아니더라고요.

누구든지 어떤 제안이 있습니까?

답변1

(sed 정규 표현식의 특수 문자가 아닙니다. 당신은 그것을 탈출할 필요가 없습니다.

sed -e 's/jQuery(function/head.ready(function/g'

[(]정규식에서 의미하는 것은 단 하나의 요소( )만 포함하는 문자 집합입니다. (이는 이를 작성하는 복잡한 방법입니다 (.

[(]대체 텍스트는 세 글자를 의미합니다 [(]. 대체 텍스트에서 괄호는 특별한 의미가 없습니다.

원하는 경우 함수를 그룹에 배치하여 함수 이름이 중복되는 것을 방지할 수 있습니다. 그룹은 백슬래시 대괄호로 구분됩니다.

sed -e 's/jQuery(\(function\)/head.ready(\1/g'

귀하가 교체한 제품에도 영향이 미치게 됩니다 jQuery(functionwithsuffix. 이를 방지하는 쉬운 방법은 확장된 Perl 정규식을 이해하는 도구를 사용하여 (?![^A-Za-z0-9_])검색 문자열 끝에 "다음에 영숫자 문자가 아닌 문자가 온다"라는 의미를 사용할 수 있도록 하는 것입니다. Perl 정규 표현식에서 는 (특별하며 앞에 백슬래시가 와야 합니다.

perl -pe 's/jQuery\(function(?![^A-Za-z0-9_])/head.ready(function/g'
perl -pe 's/jQuery\((function)(?![^A-Za-z0-9_])/head.ready($1/g'

답변2

대체 문자열에서 대괄호를 이스케이프 처리할 필요가 없습니다.

sed -e 's/jQuery[(]function/head.ready(function/g'

답변3

( 사용하는 경우 sed의 특수 문자확장 정규식(오히려).

예를 들어 sed -e실패할 것이다불일치 오류, (어떤 이유로든) 괄호를 피해야 하지만 다음을 실행해야 하는 경우sed명시되지 않은오히려:

$ regex="\("; echo "...(..." | sed 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(

$ regex="\("; echo "...(..." | sed -e 's/'$regex'/_/g'
sed: -e expression #1, char 8: Unmatched ( or \(

-E이 경우 옵션(또는 -r, ) 과 함께 sed를 사용해야 합니다 --regexp-extended.

$ regex="\("; echo "...(..." | sed -E 's/'$regex'/_/g'
..._...

$ regex="\("; echo "...(..." | sed -r 's/'$regex'/_/g'
..._...

관련 정보