경로 수정

경로 수정

$var변수 () 에 저장된 경로를 수정하여 이 작업을 수행하려고 합니다 sed. 사실 $(dirname "$var")스크립트의 목적과 관련된 이유로 대체를 해야 합니다.

이에 대한 예 는 교체할 경로가 여러 개 포함되어 있는 경우 var입니다 . 경로는 어느 위치에나 있을 수 있습니다(하나는 줄 중간 근처, 다른 하나는 줄 시작 부분 등). 아래에 예를 들어 보겠습니다 .var=/dir/dir xyz/file.txtfilenamefilename

dog foo/bar /dir/dir xyz/file.txt
a b c d /dir/dir xyz/file.txt x y z
/dir/dir xyz/file.txt 1234
{[(/dir/dir xyz/file.txt

내가 원하는 건

dog foo/bar .
a b c d . x y z
. 1234
{[(.

나는 다음을 시도했다

sed "s|"$(dirname "$var")"|.|g" "$filename"

얻다sed: -e expression #1, char 31: unterminated `s' command

도와주세요? 물론 이 외에도 다른 방법을 제안할 수도 있습니다 sed.

답변1

존재하다:

sed "s|"$(dirname "$var")"|.|g" "$filename"

따옴표로 묶여 있지만 s|따옴표 안에 있지 않으므로 분할+글로브의 영향을 받습니다.|.|g$(dirname "$var")

sed -e "s|$(dirname -- "$var")|.|g" -- "$filename"

--이 문제를 해결할 수 있지만(누락된 s도 추가) in의 왼쪽이 정규식으로 해석되기 때문에 여전히 잘못된 것입니다 (문자가 포함되어 있으면 심각한 문제가 발생할 수 있다는 것은 말할 것도 없습니다. 이는 텍스트에 적용되지만 적용되지는 않습니다). 파일 이름이 보장됩니다).s/lhs/rhs/flagssed$var|sed

예를 들어, .뿐만 아니라 모든 문자와 일치합니다 ..

다음을 수행해야 합니다.

DIR="$(dirname -- "$var")" perl -pe 's/\Q$ENV{DIR}\E/./g' < "$filename"

임의의 파일 경로를 사용할 수 있습니다.


-0777엄밀히 말하면 개행 문자를 포함한 모든 파일 경로에 대해 옵션 (slurp 모드) 을 추가해야 하며 perl후행 개행 문자를 제거하는 명령 대체를 사용할 수 없습니다. 이는 전체 콘텐츠를 모듈 에서 Perl $var에 전달하고 사용하여 수행할 수 있습니다.perldirname()File::Basename

답변2

sed를 사용하고 변수에 s가 포함되어 있지 않다고 가정하면 이것이 당신이 원하는 전부인 것 같습니다 :.

$ var='/dir/dir xyz/file.txt'
$ sed "s:$var:.:" file
dog foo/bar .
a b c d . x y z
. 1234
{[(.

왜 전화했는지 모르겠어요 dirname. 또한 우리를 sed 구분 기호로 사용하지 않으려면 /이와 같은 정규식 메타 문자를 사용하지 마십시오. |이는 기껏해야 코드를 혼란스럽게 할 뿐이므로 :항상 리터럴과 같은 문자를 선택하십시오. 환경 변수가 아닌 변수에 변수 이름을 모두 대문자로 사용하지 마세요.Bash 및 쉘 스크립트 변수의 올바른 대문자 사용.

주어진귀하의 의견dirname, 어떤 이유로든 전화해야 하는 경우 다음을 수행할 수 있습니다.

$ sed "s:$(dirname "$var"):.:" file
dog foo/bar ./file.txt
a b c d ./file.txt x y z
./file.txt 1234
{[(./file.txt

관련 정보