Termux에서 경로에 대한 "다시 쓰기"를 만드는 방법

Termux에서 경로에 대한 "다시 쓰기"를 만드는 방법

질문

저는 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입니다. ssedDebian용으로 패키지되었으므로 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

관련 정보