데비안 sed: 읽을 수 없습니다

데비안 sed: 읽을 수 없습니다

require_oncePHP 파일에서 제거 하는 명령을 실행하려고 합니다.여기(아래 코드) 그러나 오류가 발생합니다.

sed: 읽을 수 없습니다. -: 해당 파일이나 디렉터리가 없습니다.

올바른 폴더에 있습니다. 무엇이 문제입니까?

find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
  -not -wholename '*/Application.php' -print0 | \
  xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

고쳐 쓰다:

내가 실행하면 :

find . -name '*.php' -not -wholename '*/Loader/Autoloader.php' \
  -not -wholename '*/Application.php' -print0

나는 얻다:

찾기: 잘못된 술어 "-wholename"

나는 이것을 시도했고 모든 파일 목록을 반환했습니다.

find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
  -not -name '*/Application.php' -print0

그러나 이를 반영하도록 원본 콘텐츠를 변경합니다.

find . -name '*.php' -not -name '*/Loader/Autoloader.php' \
  -not -name '*/Application.php' -print0 | \ xargs -0 sed --regexp-extended --in-place 's/(require_once)/\/\/ \1/g'

오류가 발생합니다.

-bash: xargs: 명령을 찾을 수 없음

참고로 저는 sed 버전 4.1.2를 실행 중이고 명령줄에서 약간 길을 잃었으므로 답을 설명해 주세요.

답변1

오류는 sed가 읽기를 시도하고 있음을 나타내는 것 같습니다.표준 입력. 시도해 봤어?찾다섹션에서 파일이 반환되는지 확인하시겠습니까?

답변2

두 번째 호출은 의미가 없습니다. xarsg 앞에 "\"가 있는 이유는 무엇입니까? "xargs"라는 프로그램을 호출하려고 하는데 bash가 프로그램을 찾을 수 없다고 말하는 것은 놀라운 일이 아닙니다(콜론 뒤의 이중 공백에 주의하십시오).

xargs가 0개의 파일을 반환할 때(명령줄 인수가 없을 때 stdin에서 읽기를 시도하기 때문에) sed가 중단되는 오류 조건을 제거하려면 xargs 인수에 -r을 추가해야 합니다.

답변3

sed어떤 버전이 있나요? POSIX sed는 이중 대시 옵션을 이해하지 못하고 축소하지도 않지만 GNU sed는 이해합니다.

좀 더 이식성이 뛰어난(제 생각에는 더 나은) 것을 원하시면 sed -i '/require_once/s![[:space:]]*!&// !'.

답변4

아쉽게도 질문에 링크된 페이지가 사라져서 원래 명령어를 확인할 수 없습니다. 대신에 몇 가지 추측을 해보겠습니다.

첫 번째 오류는 GNU를 실행 sed하고 .txt라는 입력 파일을 내부 편집할 때 발생합니다 -. 파일이 존재하지 않으며 다음 오류가 발생합니다.

예(빈 sed스크립트 사용):

$ sed -i -e '' -
sed: can't read -: No such file or directory

파일 이름이 어디서 왔는지는 모르지만 -파일 이름을 가져오지 못하는 것과 관련이 있을 수 있습니다 find(아래 참조).

이제 명령이 더 이상 테스트를 인식하지 못 find하므로 다른 시스템이나 구현 으로 전환한 것으로 보입니다 . 이 오류는 나를 혼란스럽게 합니다.find-wholename

-wholename그런 다음 으로 변경 하되 GNU 와 동일 -name하게 변경해야 합니다 .-path-wholename-pathfind

으로 변경하더라도 find사용 중인 표현식이 정규 표현식이어야 하므로 명령이 여전히 작동하지 않습니다.-wholename-path

정규 표현식으로서 */Application.php정확한 문자열과 일치합니다 */Application.php. *정규식 시작 부분의 A는 리터럴과 일치합니다 *. 를 사용하려고 했을 수도 있지만 .*/Application.php이는 와 동일합니다 -name "Application.php".

위의 모든 사항을 고려하여 xargs호출을 제거합니다(저것명령 이름 앞의 공백을 이스케이프하면 오류가 발생합니다. 이 공백은 실제 명령 이름의 일부가 되어 찾을 수 없습니다.

find . -type f -name '*.php' \
    ! -path '.*/Loader/Autoloader.php' \
    ! -name 'Application.php' \
    -exec sed -i 's/require_once/\/\/ &/' {} +

또한 GNU 호출이 약간 줄어들므로 sed확장 정규식을 사용할 필요가 없습니다.

관련된:

관련 정보