2012-10-15 4 views
5

일치하는 결과의 특정 부분을 나중에 대체 할 변수로 저장하려고합니다. 저는 이것을 손으로하기 전에 필요한 변수를 찾는 대신 하나의 라이너에 보관하고 싶습니다.sed 명령에서 자리 표시 자/변수 사용

아파치를 구성하고, 사용 mod_rewrite를, 당신은 패턴의 특정 부분을 specificy 수있는이 같은 변수로 사용되는 : 괄호 안에 포함 년대 패턴 일치의 일부 $ 1로 저장됩니다

RewriteRule ^www.example.com/page/(.*)$ http://www.example.com/page.php?page=$1 [R=301,L] 

나중에 사용하십시오. 따라서 URL이 www.example.com/page/home 인 경우 www.example.com/page.php?page=home으로 바뀝니다. 경기의 "홈"부분은 괄호 안의 패턴 부분이므로 $ 1에 저장되었습니다.

sed 명령을 사용하여이 기능과 같은 기능을 원한다면 SQL 덤프 파일의 여러 문자열을 자동으로 바꿔서 각 테이블을 만들기 전에 drop 명령을 추가해야하지만 할 테이블 이름을 알아야합니다.

... 
CREATE TABLE `orders` 
... 

내가 좋아하는 뭔가를 실행해야합니다 :

:의 결과를 얻을 수

cat dump.sql | sed "s/CREATE TABLE `(.*)`/DROP TABLE IF EXISTS $1\N CREATE TABLE `$1`/g" 

을이 덤프 파일은 같은 것을, 그래서이 포함 된 경우

... 
DROP TABLE IF EXISTS `orders` 
CREATE TABLE `orders` 
... 

sed 명령의 mod_rewrite 구문을 사용하여 논리적 예제로 사용하고 있습니다.

제안 사항?

답변

8

CREATE TABLE 문을 찾고 테이블 이름을 캡처하십시오. 'DROP TABLE IF EXISTS'와 테이블 이름, 명령문을 종료하는 세미콜론 및 CREATE TABLE 문을 보존하기 위해 일치 된 것을 복사하십시오.

표기법은 sed입니다. bash을 사용하고 있기 때문에 GNU sed을 사용할 가능성이 있으며 그 표기법을 사용하려면 --posix을 추가해야합니다. 그렇지 않으면 GNU의 표준이 아닌 sed 정규 표현식을 사용하도록 스크립트를 추출해야합니다. 또한 출력에 개행을 삽입하려고 시도하지 않았습니다. GNU sed으로 충분히 할 수 있다면 그렇게 할 수 있습니다.

요점은 괄호 (대개는 백 슬래시로 이스케이프해야 함)가 캡처 메커니즘이며 백 슬래시 번호가 대체 메커니즘입니다.

+0

https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html이 설명 주셔서 감사합니다, 그것은 완전히 내 질문에 대답했다. –

6
sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" dump.sql 

시험는 :

kent$ cat t.txt 

CREATE TABLE `orders` 
... 

CREATE TABLE `foo` 
... 
... 

CREATE TABLE `bar` 
... 


kent$ sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" t.txt 

DROP TABLE IF EXISTS `orders` 
CREATE TABLE `orders` 
... 

DROP TABLE IF EXISTS `foo` 
CREATE TABLE `foo` 
... 
... 

DROP TABLE IF EXISTS `bar` 
CREATE TABLE `bar` 
... 
+0

감사합니다. 이것은 아주 명확한 예입니다. –

1

이것은 "역 참조"라고합니다. 그리고 sed는 괄호 사이에있는 것들에 번호를 붙이기 시작할 것입니다. \ (... \)

위의 이스케이프 문자로 백 슬래시를 사용합니다.

참조 :