Bash/sed에서 값을 바꾸는 방법

Bash/sed에서 값을 바꾸는 방법

내 파일에는 다음 텍스트가 있습니다

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 >

관련 정보