2009-06-22 20 views

Antwort

1

Setzen Sie den Cursor in der ersten Zeile/Spalte und versuchen Sie dies:

:redir > output.txt|while search('href="', "We")|exe 'normal yi"'|echo @"|endwhile|redir END
+0

Was bedeutet "wir" hier? – allenhwkim

+0

'W' = Umbrechen Sie die Suche nicht nach dem Ende der Datei. 'e' = gehe zum Ende des Spiels. Siehe ': h search()'. –

0

Haben Sie das versucht?

: g/href = "\ v ([a-z _ /] +)"/w >> outfile

+2

Dies funktioniert nicht.Dies führt dazu, dass der Suchbegriff korrekt gefunden wird, aber dann wird einfach der gesamte Inhalt der Datei in das neue Ausgabedatei ausgegeben. – Sasha

2

Die Herausforderung liegt hier mit allen Links zu extrahieren, wo es auf der Leitung mehrfach sein kann, sonst Sie wäre in der Lage, einfach tun:

" Extract all lines with href= 
:g/href="[^"]\+"/w >> list_of_links.txt 
" Open the new file 
:e list_of_links.txt 
" Extract the bit inside the quotation marks 
:%s/.*href="\([^"]\+\)".*/\1/ 

Der einfachste Ansatz wahrscheinlich, dies zu tun wäre:

" Save as a new file name 
:saveas list_of_links.txt 
" Get rid of any lines without href= 
:g!/href="\([^"]\+\)"/d 
" Break up the lines wherever there is a 'href=' 
:%s/href=/\rhref=/g 
" Tidy up by removing everything but the bit we want 
:%s/^.*href="\([^"]\+\)".*$/\1/ 

Alternativ (nach einem ähnlichen Thema),

:g/href="[^"]\+"/w >> list_of_links.txt 
:e list_of_links.txt 
:%s/href=/\rhref=/g 
:%s/^.*href="\([^"]\+\)".&$/\1/ 

(siehe: help saveas,: help: vglobal,: Hilfe: s)

aber wenn Sie es wirklich in einer direkteren Art und Weise tun wollen, könnten Sie so etwas tun:

" Initialise register 'h' 
:let @h = "" 
" For each line containing href=..., get the line, and carry out a global search 
" and replace that extracts just the URLs and a double quote (as a delimiter) 
:g/href="[^"]\+"/let @h .= substitute(getline('.'), '.\{-}href="\([^"]\+\)".\{-}\ze\(href=\|$\)', '\1"', 'g') 
" Create a new file 
:new 
" Paste the contents of register h (entered in normal mode) 
"hp 
" Replace all double quotes with new-lines 
:s/"/\r/g 
" Save 
:w 

Schließlich könnten Sie es in einer Funktion mit einer for-Schleife tun, aber ich werde das für jemand anderen zu schreiben lassen!

10

Jeff Frikadelle Yang fast da war.

Als Sasha schrieb, wenn Sie verwenden w es die vollständige Originaldatei auf die outfile

Um nur schreiben die gefundene Zeile schreibt, muss man hinzufügen ‚‘ vor 'w':

:g/href="\v([a-z_/]+)"/ .w >> outfile 

Beachten Sie, dass das Outfile vorhanden sein muss.

+2

Wenn die Datei nicht existiert, oder wenn Sie die Datei erstellen möchten, können Sie: '.w!' – Tom

2

klar reg: x

qxq 

Suche regex (was auch immer) und hängen an reg: x

:g/regex/call setreg('X', matchstr(getline('.'), 'regex') . "\n") 

eine neue Registerkarte öffnen

:tabnew outfile 

put reg: x

"xp 

Schreib Datei

:w 
+0

Ich habe viel aus dieser Antwort gelernt. qxq, um reg x zu löschen. Verwenden von Großbuchstaben X wird an das Register X angefügt und extrahiert nur die übereinstimmende Zeichenfolge aus einer übereinstimmenden Zeile. Vielen Dank! Vielen Dank! – Amjith