2012-10-15 20 views
5

Chcę zapisać konkretną część dopasowanego wyniku jako zmienną, która ma być później użyta do zastąpienia. Chciałbym zachować to w jednej linijce, zamiast znaleźć potrzebną zmienną przed ręką.Używanie symboli zastępczych/zmiennych w poleceniu sed

podczas konfiguracji apache, a użycie mod_rewrite można specificy poszczególnych części wzorów do wykorzystania jako zmienne, podobnie jak to:

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

część meczu wzór, który jest zawarty wewnątrz nawiasu są przechowywane 1 $ do wykorzystania później. Więc jeśli adres URL to www.example.com/page/home, zostanie zastąpiony przez www.example.com/page.php?page=home. Więc "domowa" część meczu została zapisana w 1 $, ponieważ była częścią wzorca wewnątrz nawiasu.

Chcę czegoś takiego jak ta funkcja z komendą sed, potrzebuję automatycznie zastąpić wiele ciągów w pliku zrzutu SQL, aby dodać tabelę kropli, jeśli istnieją polecenia przed każdą tabelą tworzenia, ale muszę znać nazwę tabeli do zrobienia to, więc jeśli plik zrzutu zawiera coś takiego:

... 
CREATE TABLE `orders` 
... 

trzeba uruchomić coś takiego:

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

aby uzyskać wynik:

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

Używam składni mod_rewrite w komendzie sed jako logicznego przykładu tego, co próbuję zrobić.

Wszelkie sugestie?

Odpowiedz

8
sed '/CREATE TABLE \([^ ]*\)/ s//DROP TABLE IF EXISTS \1; &/' 

Znajdź CREATE TABLE i uchwycić nazwę tabeli. Zastąp go tabelą "DROP TABLE IF EXISTS" i nazwą tabeli, a także średnikiem, aby zakończyć instrukcję, oraz kopią tego, co zostało dopasowane, aby zachować instrukcję CREATE TABLE.

To jest notacja klasyczna o oznaczeniu sed. Ponieważ używasz bash, istnieje szansa, że ​​używasz GNU sed i będziesz musiał dodać --posix, aby użyć tej notacji, lub będziesz musiał wypróbować skrypt, aby użyć niestandardowych wyrażeń GNU z niestandardowych sed. Nie próbowałem również wstawiać nowego wiersza do wyjścia. Możesz to zrobić z GNU sed, jeśli jest to dla ciebie wystarczająco ważne.

Kluczowymi punktami są nawiasy (klasycznie wymagające ucieczki z odwrotnym ukośnikiem), które są mechanizmem przechwytywania, a odwrócony ukośnik - mechanizm zamienny.

+0

Dziękuję za to wyjaśnienie, to całkowicie odpowiedział na moje pytanie. –

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

Test:

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

Dzięki, jest to doskonały, wyraźny przykład. –

Powiązane problemy