![CSS 및 Javascript 콘텐츠 내의 파일 이름에서 슬래시/상위 경로를 제거합니다.](https://linux55.com/image/2885/CSS%20%EB%B0%8F%20Javascript%20%EC%BD%98%ED%85%90%EC%B8%A0%20%EB%82%B4%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%97%90%EC%84%9C%20%EC%8A%AC%EB%9E%98%EC%8B%9C%2F%EC%83%81%EC%9C%84%20%EA%B2%BD%EB%A1%9C%EB%A5%BC%20%EC%A0%9C%EA%B1%B0%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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.EXT
FILE.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