결국 일부 절대 경로를 상대 경로로 바꾸는 더 큰 스크립트의 일부로 경로의 모든 폴더를 ".."로 바꾸려고 합니다.
예상되는 출력은 다음과 같아야 합니다.
/ABCDdasda234sEA/asdas2das/asdasf34234/ => /../../../
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/ => /../../../../
다양한 정규식을 시도했지만 마지막 "/"가 여러 번 일치하지 않고 문자열의 끝으로 간주되기 때문에 일치 항목을 올바르게 얻을 수 없습니다.
[root@test]# sed "s/^\/.*\/$/\/..\//g" <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/"
/../
답변1
1) .*
다음 슬래시를 포함한 모든 것을 먹을 것이므로 [^/]*
(슬래시를 제외한 모든 문자를 사용하십시오)
2) 모든 버전에서 사용할 수 없는 문제 \+
("한 번 이상 발생")를 방지하려면 sed
최소한 하나의 문자가 필요한 점을 추가하세요. [^/]
다른 사람이 없다고 믿는다면 여기에 다른 사람이 필요하지 않습니다//
s
_
3) 미화를 위해: 패턴이나 대체 항목에 슬래시가 포함된 경우 또는 명령에 다른 구분 기호를 사용하면 읽기가 더 쉽습니다.#
모든 것을 한 번에:
sed 's_/.[^/]*_/.._g'
답변2
awk -F/ -v OFS=/ '{for (i=1; i<=NF; i++) if (length($i)) $i = ".."}1' <<END
/ABCDdasda234sEA/asdas2das/asdasf34234/
/ABCDdasda234sEA/asdas2das/asdasf34234/124551assdfa/
END
/../../../
/../../../../
답변3
동시에 나는 두 가지 방법을 더 발견했습니다.
sed 's:/[[:alnum:]]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346346/" | sed 's:^..::g'
awk -F'/' '{for( i = 2; i <= NF-1; i++ ) printf "/../" }' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/asfasddfg/2345555/" | sed 's/\/\//\//g'
"_"와 같은 기타 특수 문자도 포함됩니다.
sed 's:/[[:alnum:]_]*:../:g' <<< "/ABCDdasda234sEA/asdasdas/asdasf34234/42346346$346/" | sed 's:^..::g'
답변4
일부 버전sed정규식의 고급 기능(예:+또는{}) 기본적으로. 내 시스템에서는\+잘 작동합니다.
또는 교체할 수 있습니다.\w이것과 함께[^/], 파일 이름에 공백이 포함될 수 있기 때문입니다.