여러 개의 .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'
..._...