저는 프로젝트를 위해 상당히 큰 스크립트를 작성하고 있는데, 스크립트를 마치기 전에 겪고 있는 문제 중 하나는 sed 명령을 사용하는 것입니다.
(cache.php에 있는) 줄을 찾으려고 합니다:
$cache_directory = './cache';
'./cache'
정보를 이름이 지정된 변수로 바꿉니다 $new_cache_directory
.
내가 가진 문제 중 하나는 ./cache
그것이 여러 번 존재한다는 것입니다. 나는 단지 이 줄을 바꾸고 싶을 뿐이지만, 줄 번호를 "하드코딩"하여 "미래 보장"을 하고 싶지도 않습니다.
어떻게 해야 하나요?
답변1
이 시도:
sed -i.bak "s:^.*\(\$cache_directory = \)\('./cache'\):\1$new_cache_directory:" infile
답변2
따라서 "캐시"를 이름이 아닌 해당 변수의 내용으로 바꾸고 싶은 것 같습니다.
sed 's#^$cache_directory = ../cache.;#$cache_directory = '$new_cache_directory'#' script.php
따라서 해결해야 할 다른 문제가 있습니다. 일반적으로 sed 명령은 's/foo/bar/' 부분을 구분하기 위해 슬래시를 사용합니다. 경로를 다룰 때 이는 불안한 일이지만 사용할 수 있는 구분 기호가 많이 있습니다. "s" 뒤에 암묵적으로 선언됩니다.
질문 2도 비슷합니다. 우리는 종종 작은따옴표를 사용하여 명령을 지정합니다.
sed 'command' file
하지만 여기서는 ./cache 주위에 아포스트로피가 있습니다. 어떻게 해야 할까요? 한 가지 아이디어는 다음과 같습니다.
sed "command" file
대신 이것은 일반적으로 작동하지만 여기서는 작동하지 않습니다. 아포스트로피는 달러 기호가 해석되는 것을 방지하지만 따옴표는 해석되는 것을 방지하지 않습니다. 일반적으로 아포스트로피가 필요하지 않으며 다음과 같이 작성할 수 있습니다.
sed s/standart/standard/g sample.txt
그러나 다시 $cache_directory를 명령의 변수로 지정하면 해석됩니다. 그래서 저는 아포스트로피를 광대 점으로 바꾸고 다른 표현이 그 부분과 일치한다면 매우 놀랄 것 ../cache.
입니다 xy/cachei
.
그런데 $new_cache_directory를 변수의 내용으로 바꾸고 싶어서 마스크를 끄고 = '
변수를 삽입한 후 다시 마스크를 켜서 "#"으로 명령을 완성했습니다.