查找不以“<”开头的行,执行操作

时间:2010-02-15 14:38:28

标签: regex vim sed

使用vim并且有一个大文本文件,其中包含在throoghout中抛出的一些 html。我正在尝试为网络做准备,并且需要将<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>

如何找到匹配起始<字符的行?

5 个答案:

答案 0 :(得分:10)

^([^<].*)$

确保您的选项不允许“点匹配换行符”并替换为:

<p>$1</p>

Vim要求你逃避某些角色,但我没有vim,所以这是我对整个规则的最佳猜测:

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

答案 1 :(得分: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>

答案 2 :(得分:1)

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

或者:

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

这就是所需要的一切。

答案 3 :(得分:0)

这应该有效:

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

答案 4 :(得分:0)

另一种方法:

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

^ O实际按下CTRL + o

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

:v/^</normal yss<p>