2010-02-15 53 views
4

我正在使用vim並且有一個大文本文件,其中包含一些 html在Throoghout中拋出。我正在嘗試爲網絡做好準備,並且需要將<p></p>標記添加到尚未格式化的行中。這裏是什麼,我有一個例子:我正在尋找一種方式來搜索該行查找不以「<」開頭的行,執行操作

Paragraph text one one line [... more ... ] 
Other paragraph text on the next line [... more ... ] 
<h1>html element thrown in on its own line</h1> 
More paragraph text [... more ... ] 
<!-- some other element (always own line) --> 
There is still more text! 

<字符開頭,並且對於這些線路,加開閉<p></p>標籤......使,後來,我的文件類似於此:

<p>Paragraph text one one line [... more ... ] </p> 
<p>Other paragraph text on the next line [... more ... ] </p> 
<h1>html element thrown in on its own line</h1> 
<p>More paragraph text [... more ... ] </p> 
<!-- some other element (always own line) --> 
<p>There is still more text! </p> 

我如何發現比賽起始<字符行?

回答

10
^([^<].*)$ 

確保你的選擇禁止「點匹配換行」,並替換爲:

<p>$1</p> 

Vim需要你逃避某些字符,但我不actially有vim的,所以這是我最好的猜測整個規則:

s:^\([^<].*\)$:<p>\1</p>:g 
+0

什麼意思_disallow點匹配newline_?對不起,我是vim的新手。我使用了'%s:^ \([^>]。* \)$:

\ 1

:g',並且爲_every_行添加了段落標籤(即使是已經有標籤的段落標籤)。幾乎在那裏...... – thornomad

+1

最後一個表達式中的尖括號指向錯誤的方向。 '[^>]'應該是'[^ <]'。 – Nefrubyr

+0

@thornomad:對不起,Nefrubyr是正確的。尖括號是錯誤的。我糾正了這條線。 –

1

這裏的邏輯。通過該文件,在該行的開頭檢查<,如果不存在,則使用<p></p>構建一個新字符串並將其回顯出來。真的沒有需要複雜的正則表達式

使用bash

#!/bin/bash 
shopt -s extglob 
while read -r line 
do 
    case "$line" in 
     "<"*) echo $line ;; 
     *) echo "<p>$line</p>";; 
    esac 
done <"file" 

使用awk

$ awk '!/^</{$0="<p>"$0"</p>"}{print}' file 

輸出

$ awk '!/^</{$0="<p>"$0"</p>"}1' file 
<p>Paragraph text one one line [... more ... ]</p> 
<p>Other paragraph text on the next line [... more ... ] </p> 
<h1>html element thrown in on its own line</h1> 
<p>More paragraph text [... more ... ] </p> 
<!-- some other element (always own line) --> 
<p>There is still more text!</p> 
+0

「不需要複雜的正則表達式」,並且您正在提供需要啓動外部工具的解決方案? – 2010-02-15 15:09:51

+0

vim,對於shell,IS也是一個外部工具。無論是awk,sed,vim,ed等等,所有這些工具都可以處理文件!他們之間確實沒有太大的區別。即使普通的舊shell也可以用來「編輯」文件。不,我的解決方案不是從vim啓動的,如果這就是你所說的話。它們從命令行運行。 – ghostdog74

+0

OP說他正在運行vim。所以調用shell/bash的東西是外部的。 – 2010-02-15 15:45:30

0

這應該工作:

:%s/^\s*[^<]\+$/<p>&<\/p>/g 
+0

它必須以<,但<稍後才能開始。我會將\ +改成*。 – 2010-02-15 15:10:12

+0

我不會。我的正則表達式不處理空行。不會有

。 –

1
:%s/^[^<].*/<p>&<\/p>/ 

或者:

:v/^</s#.*#<p>&</p># 

這就是所有需要的。

+0

空行怎麼樣? –

+0

他們呢? – 2010-02-16 14:18:22

0

另一種方式來做到這一點:

:v/^</normal I<p>^O$</p> 

^o做實際上按CTRL + O

或者,如果您使用surround.vim插件:

:v/^</normal yss<p>