Çift tırnakların lot çevresinde kullanıldığını fark ettim, bu yüzden cmd.exe'de yapıldığını tahmin ediyorum (birçok linux kullanıcısı grep kullanıyor olsa da, windows sürümü var. Windows uygulaması, çift tırnak kullanımınız sayesinde, ben de grep'in Windows uygulamasını kullanıyorum - Gnuwin32 one. (örneğin cygwin'in yerine).
Her şeyden önce, grep ile birlikte kullandığınız satırdaki hatayı düzeltmek istiyorum (regex'inizde bir hata demeyeceğim, çünkü bu bir cmd sorunu.
İşe yaramaz grep ile regex ile örnek oldu.
curl http://example.com/?q=blah | grep -o -P "(?<=alt=\")[^\"]*\"" | what's next?
Dediğin gibi, [^\"] çalışmıyor
Bakalım tam olarak grd'ye cmd ile geçmenin ne olduğunu görelim (grep'in ayrıştırması)
Bu bir C programı gerektirecek, C programı çalışmayan bir teklif hakkında bu soruya dahil edildi Bu basit düzenli ifadenin grep ile eşleşmesi
C programının kodunu buraya yapıştıracağım.
Bu programı, herhangi bir programın veya herhangi bir programın ne aldığını görmek için kullanabilirsiniz. (Burada bazı teknikler konusunda yanılmış olabilirim ve eğer öyleyse bir düzeltme bekliyorum). Dedi, bu işe yarıyor.
İşte neler olup bittiğini belirlemek için kullanacağımız program
#include <stdio.h>
int main(int argc, char *argv[]) {
int i = 0;
while (argv[i]) {
printf("argv[%d] = %s\n", i, argv[i]);
i++;
}
return 0;
}
Derledim. w.c
İşte olanlara basit bir örnek.
İşte işe yarayan bir örnek
W:\>w "[^\"]"
argv[0] = w
argv[1] = [^"]
W:\>
Yukarıda gördüğünüz gibi, programımız (w) 2 parametre alır, ilki programın adı (w), ikincisi [^"]
Şimdi, sizinkiyle aynı olan daha küçük bir örnek. [^\"] çalışmıyor
W:\>w "\"[^\"]"
argv[0] = w
argv[1] = "["]
W:\>
Grep'in ne yaptığını görün. Nedenini bilmiyorum .. Ama sanırım \ "[^ \"] 'den önce olduğunda ve her şeyin etrafında çift tırnak var, sonra [^ \ "] işe yaramıyor, tam sonucu görüyoruz , [^ \ "], ["] olarak çıkıyor. Biz, karnımızı kaybediyoruz ^
Bu, programda görebileceğimiz gibi, karnemizi koruyacaktır.
W:\>w "\"[^^\"]"
argv[0] = w
argv[1] = "[^"]
W:\>
Bu pencere sayısının yanı sıra, regex'inizde muhtemelen bir alıntı için bakmak isteyeceğiniz bir sorun var, bu nedenle bitiş alıntıyla eşleşmiyorsunuz. Başlangıç teklifiyle eşleşmeyecek şekilde göz kamaştırmasını haklı olarak dahil ettin.
Örnek olarak
W:\>echo blah alt="test" | grep -o -P "(?<=alt=\")[^^\"]*(?=\")"
test
Farz edelim ki bu dosya a.a adındaydı.
dsfsdf dfdsf alt="here" dddd
rrtrtdfddalt="there"dfdfd
alt="df"
tree="dop"
Şimdi uyguluyoruz
W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df
W:\>
Yani, regex çalışır ve grep.
W:\>grep -oP "(?<=alt=\")[^^\"]*(?=\")" a.a
here
there
df
W:\>
Şimdi bunu bir dosyaya verebileceğimi varsayalım. a.b yani a.b şimdi bu 3 satırı içeriyor. (her zaman a.b'ye kopyalayıp yapıştırabilirsiniz)
Şimdi a.b
here
there
df
haydi biraz önce ve sonra eklemek için sed kullanalım
W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>
Ve hepsini wget ile indirebiliriz.
W:\>sed -r "s#(.*)#http://blah.com/\1.htm#" a.b >a.c
W:\>type a.c
http://blah.com/here.htm
http://blah.com/there.htm
http://blah.com/df.htm
W:\>wget -i a.c
--2012-07-26 23:21:06-- http://blah.com/here.htm
Resolving blah.com... ^C
W:\>