질문
저는 Termux를 사용하고 있는데 Termux에서는 가 /usr
아니지만 /data/data/com.termux/files/usr
.
이로 인해 Termux를 염두에 두고 설계되지 않은 스크립트(주로 bash 및 make)를 실행할 때 문제가 발생하는 경우가 있습니다.
나의 의도
스크립트가 에서 시작하는 경로의 파일을 열려고 할 때마다 /usr
유효한 경로로 "다시 작성"되기를 원합니다.
이 문제에 대한 해결책도 환영합니다.
답변1
간단한 대답은 " 스크립트에서 to sed
의 모든 항목을 변경하는 것"입니다. 예를 들어/usr
/data/data/com.termux/files/usr
sed -i -e 's=/usr=/data/data/com.termux/files/usr=g' *.sh
문제는 경로 중 일부 또는 전부가 /usr
이미 로 변경된 경우 /data/data/.../usr
다시 변경되어 결국에는 로 변경된다는 것입니다 /data/data/com.termux/files/data/data/com.termux/files/usr
. 예를 들어
$ echo /usr | sed -e 's=/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /data/data/com.termux/files/usr | sed -e 's=/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/data/data/com.termux/files/usr
이 문제를 해결하려면 /usr 앞에 공백이 있거나 줄 시작 부분에 있는 경우에만 변경을 허용하십시오.
$ echo /data/data/com.termux/files/usr | sed -e 's=\(^\|[[:space:]]\)/usr=\1/data/data/com.termux/files/usr=g'
또는 좀 더 읽기 쉽게 확장 정규 표현식을 사용하세요.
$ echo /data/data/com.termux/files/usr | sed -E -e 's=(^|[[:space:]])/usr=\1/data/data/com.termux/files/usr='
/data/data/com.termux/files/usr
다음은 내가 뒤돌아보기가 불필요하다는 것을 기억하기 전에 작성되었습니다(IMO, 그것은 "더 나은" 일반적으로 유용한 솔루션이지만 꼭 필요한 것은 아닙니다)....유용한 정보이기 때문에 여기에 남겨두고 다음과 같이 삭제하고 싶지 않습니다. 이것:
또는 "negative lookbehind"라는 정규식 기능을 사용할 수 있습니다. 불행하게도 sed는 Look-Behind나 Look-aheads(*)를 지원하지 않습니다.
Perl은 둘러보기를 지원하므로 Termux와 함께 Perl을 설치한 경우 이를 사용할 수 있습니다(termux를 마지막으로 사용한 지 오래되어서 기본 Perl이 포함되었는지 기억이 나지 않습니다. 물론 설치 가능한 Bag입니다). 예를 들어
perl -i -p -e 's=(?<!/data/data/com.termux/files/)/usr=/data/data/com.termux/files/usr=g' *.sh
(그런데 -p
옵션이 있으면 Perl은 표준 입력이나 파일을 수정하는 도구로서 sed처럼 작동합니다. -n
옵션이 있으면 Perl은 sed처럼 작동합니다 sed -n
. 이것은 의도적인 것입니다. Perl의 이런 방식은 Perl의 모든 기능으로 강화된 sed와 유사한 도구).
또는 다음과 같은 경우 부정적인 뒤돌아보기를 사용하면 /usr 변경을 피할 수 있습니다.어느영숫자 또는 /
문자가 바로 앞에옵니다 /usr
.
perl -i -p -e 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g' *.sh
아래에서 /usr은 그 자체일 때만 변경되는 것을 볼 수 있습니다.
$ echo /usr | perl -pe 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /data/data/com.termux/files/usr | perl -pe 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g'
/data/data/com.termux/files/usr
$ echo /foo/bar/usr | perl -pe 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr=g'
/foo/bar/usr
(*) 내가 아는 한, 둘러보기를 지원하는 유일한 sed 버전은 Super Sed 또는SSD(현재 홈페이지를 이용할 수 없습니다.) ssed
버려진 소프트웨어인 것으로 보이며 수년 동안 업데이트되지 않았습니다. 이는 1998년의 GNU sed 3.02를 기반으로 하며 현재 GNU sed는 2020년의 버전 4.8입니다. ssed
Debian용으로 패키지되었으므로 Termux에서도 사용할 수 있습니다. 하지만 설치하고 싶다면 Perl을 사용해도 됩니다.
어쨌든 Perl 호환 정규식을 사용할 수 있는 옵션이 ssed
있습니다 .-R
폴리 메라 제 연쇠 반응.
$ echo /data/data/com.termux/files/usr | ssed -R 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr='
/data/data/com.termux/files/usr
$ echo /foo/bar/usr | ssed -R 's=(?<![[:alnum:]/])/usr=/data/data/com.termux/files/usr='
/foo/bar/usr