CSS 및 Javascript 콘텐츠 내의 파일 이름에서 슬래시/상위 경로를 제거합니다.

CSS 및 Javascript 콘텐츠 내의 파일 이름에서 슬래시/상위 경로를 제거합니다.

css나와 파일을 모두 확인해야 하는데 js, 참조된 파일 이름에 슬래시( /)가 있으면 슬래시를 제거해야 합니다.

내가 원하는 것은:

  • 참조된 파일 중 이름이 지정된 경우 /file.jpg선행 슬래시가 제거되고 file.jpg.

    예를 들어 CSS 파일에서 다음을 변경합니다.

    @import url("/base.css");도착하다@import url("base.css");

  • 참조된 파일의 이름이 지정된 경우 /files/file.jpg선행 슬래시와 폴더 이름을 제거하고 file.jpg.

나는 그것을 쓰기 시작했지만 슬래시를 어떻게 해야 할지 알 수 없었습니다.

grep -o -h -E '[A-Za-z0-9:./_-]+\.(png|jpg|gif|tif|css)' `find
${new_directory} -name '*.css' -or -name '*.js'`

이 작업을 수행하는 방법을 아시나요? .sh이 작업을 수행하기 위해 쉘 스크립트를 사용하고 있습니다 .

답변1

이런 식으로 출력을 구문 분석하지 마십시오 find. 파일에 특수 문자가 포함되어 있지 않으면 작동하지만 찾은 파일에 대해 명령을 호출하는 것이 find더 쉽고 안정적입니다.find

find "$new_directory" -name '*.css' -o -name '*.js' -exec grep … {} +

글쎄, grep이것은 텍스트 교체를 수행하는 데 적합한 도구가 아니며 단지 검색 도구일 뿐입니다. sed가장 널리 사용되는 기능은 정규식 대체 기능인 스트림 편집기입니다. GNU sed(예: Linux에서 발견됨)를 가정하고 정규 표현식이 기본적으로 정확하다고 가정하면, 즉 파일 이름처럼 보일 수 있는 문자나 숫자 또는 확장자의 순서를 일치시키려는 경우 다음과 :._-같이 모든 곳에서 sed호출 대체를 수행 .DIR1/DIR2/FILE.EXTFILE.EXT

sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'

이 두 부분을 합치고 교체를 원할 경우 가장 쉬운 방법은 -i바로 그 작업을 수행하는 GNU sed 옵션을 사용하는 것입니다.

find "$directory" -name '*.css' -o -name '*.js' \
     -exec sed -e 's![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g' {} +

대체 파일을 다른 위치에 넣으려면 새 파일의 이름을 구성하기 위해 중간 쉘 접착제가 필요합니다.

find "$old_directory" -name '*.css' -o -name '*.js' \
     -exec sh -c 'sed -e '\''s![/A-Za-z0-9:._-]*/\([A-Za-z0-9:._-]*\.\(png\|jpg\|gif\|tif\|css\)\)!!g'\' <"$0" >"/new/directory/$0"' {} \;

'\''작은따옴표로 묶인 쉘 조각에 작은따옴표를 넣는 방법을 참고하세요 . 일괄적으로 가능한 많은 파일에 대해 명령을 실행하는 -exec … {} \;것과 달리 각 파일에 대해 한 번 명령을 실행하는 것을 의미합니다 .-exec … {} +

답변2

basename내장된 것을 사용하세요 . 작동 방식은 다음과 같습니다.

$ basename "/abc/def/ghi.jkl"
ghi.jkl

관련 정보