내 파일에는 다음 텍스트가 있습니다
http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml
이게 필요해요(sed를 사용해야 할 것 같은데요?)
http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
답변1
sed 's/\([^/]*\)\.phtml$/mydirectory\/\1.php/' <filename>
필요하시면 해드리겠습니다. (선택적으로 -i
내부 교체를 위해 플래그를 사용합니다.)
그것을 분해하려면 먼저
s/<regexp>/<replacement>/
<regexp>
그러면 일치하는 콘텐츠가 대체됩니다 <replacement>
. 다음으로 정규식을 살펴보겠습니다.
\([^/]*\)\.phtml$
먼저, 끝에서 줄 끝의 문자열을 \.phtml$
찾습니다 . 정규식을 줄 끝에 고정하고 점 앞에 백슬래시를 추가하여 이스케이프 처리합니다. 일반적으로 점은 무엇이든 일치하기 때문입니다..phtml
$
그 후에는 다음이 남습니다.
\([^/]*\)
가운데를 보면 [^/]
문자( []
대괄호 안의 문자 중 하나와 일치함)를 일치시킬 것입니다. 이 문자는 슬래시가 아닌 모든 문자일 수 있습니다. ^
음수 일치가 이루어지므로 ^/
"슬래시 제외" 대괄호 안에. 오른쪽 대괄호 뒤에 별표가 있습니다. *
이는 대괄호 안의 하나 이상의 문자와 일치함을 의미합니다.
그런 다음 위의 내용을 래핑 \(
하면 \)
대괄호 안의 일치 항목을 캡처하고 <replacement>
섹션에서 사용할 s/<regexp>/<replacement>/
수 있도록 허용합니다.
그런 다음 이 <replacement>
섹션에는 다음이 있습니다.
mydirectory\/\1.php/
일치하는 reexecp를 첫 번째로 대체합니다. 이는 mydirectory/
sed 교체를 위한 구분 기호로 사용되고 캡처된 텍스트를 첫 번째 캡처 그룹에 넣는 데 사용되므로 슬래시로 바꿔야 합니다. 그런 다음 확장자를 추가합니다. 끝./
\1
.php
/
이 모든 것이 합쳐진다는 것은 마지막 것부터 까지의 모든 것을 캡처하고 .phtml
, 마지막 슬래시 뒤에 추가하고 mydirectory/
, 캡처한 텍스트를 다시 쓴 다음 .php
확장자를 추가한다는 것을 의미합니다.
답변2
moi@laptop:/home/moi/tmp >cat in.txt
http://mydomain.com/test.phtml
http://mydomain.com/classes/main.class.phtml
http://mydomain.com/scripts/filemanager/nl.phtml
moi@laptop:/home/moi/tmp >sed -i 's/\/\([^\/]\+\)\.phtml/\/mydirectory\/\1.php/g' in.txt
moi@laptop:/home/moi/tmp >cat in.txt
http://mydomain.com/mydirectory/test.php
http://mydomain.com/classes/mydirectory/main.class.php
http://mydomain.com/scripts/filemanager/mydirectory/nl.php
moi@laptop:/home/moi/tmp >