2012-10-15 20 views
5

Daha sonra değiştirmek üzere kullanılacak bir değişkenin belirli bir bölümünü değişken olarak saklamak istiyorum. Bunu elden önce ihtiyacım olan değişkeni bulmak yerine tek bir astarda tutmak isterim.Bir sed komutunda yer tutucuları/değişkenleri kullanma

apacheyi yapılandırılması ve kullanımı mod_rewrite, sen desen belirli bölümlerini specificy bu gibi değişkenler olarak kullanılmak üzere: Parantez içinde bulunan ediyor desen maçın parçası 1 $ olarak depolanır

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

daha sonra kullanmak için. Yani URL www.example.com/page/home ise, www.example.com/page.php?page=home ile değiştirilir. Bu yüzden maçın "ev" kısmı 1 $ 'a kaydedildi çünkü parantez içindeki paternin bir parçasıydı.

sed komutuyla bu işlevsellik gibi bir şey istiyorum, her bir tablodan önce komutlar varsa, tabloyu eklemek için bir SQL dökümü dosyasında birçok dizeyi otomatik olarak değiştirmeniz gerekiyor, ancak tablo adını bilmem gerekiyor

... 
CREATE TABLE `orders` 
... 

Ben böyle bir şey çalıştırmanız gerekir:

: sonucunu almak için

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

bu, döküm dosyası gibi bir şey bu yüzden içeriyorsa

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

sed komutunda mod_rewrite sözdizimini, yapmaya çalıştığım şeyin mantıksal bir örneği olarak kullanıyorum.

herhangi bir öneriniz?

cevap

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

CREATE TABLE ifadesini bulun ve tablo adını yakalayın. 'DROP TABLE IF EXISTS' ve tablo adı ile birlikte ifadeyi sonlandırmak için bir yarım virgül ve CREATE TABLE deyimini korumak için eşleştirilenin bir kopyasını kullanın.

Bu, klasik sed gösterimidir. bash'u kullandığınızdan, GNU sed kullanıyor olmanız ve bu notasyonu kullanmanız için --posix eklemeniz gerekeceği veya GNU'nun standart dışı sed regex'lerini kullanması için komut dosyasını kullanmanız gerekecek. Ayrıca çıktıya yeni satır eklemek istemedim. Bunu sizin için önemliyse GNU sed ile yapabilirsiniz.

Anahtar noktalar, parantezlerdir (klasik olarak bir ters eğik çizgi ile kaçması gerekir), yakalama mekanizmasıdır ve ters eğik çizgi, değiştirme mekanizmasıdır.

+0

https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html bu açıklama için teşekkürler, bu tamamen benim soruya cevap vardır. –

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

testi:

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

Teşekkürler, bu mükemmel bir örnek. –

1

Bu "arka referans" olarak adlandırılır. Ve sed, parantez arasındaki şeyleri numaralamaya başlayacak. \ (... \)

Yukarıda bir çıkış karakteri olarak ters eğik çizgi kullanımına dikkat edin.

Ref: