查找不以"<"开头的行并执行操作

7

我正在使用vim编辑器,有一个包含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个回答

12
^([^<].*)$

确保您的选项禁止“点匹配换行符”,并替换为:

<p>$1</p>

Vim需要你转义某些字符,但我实际上没有vim,所以这是我对整个规则的最佳猜测:

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

禁止点匹配换行符是什么意思?抱歉,我对 vim 不熟悉。我使用了 %s:^\([^>].*\)$:<p>\1</p>:g 命令,并且它会将段落标签添加到每一行(即使已经有标签的行)。快成功了…… - thornomad
1
那个表达式中的尖括号指向错误的方向。[^>] 应该是 [^<] - Nefrubyr
@thornomad:抱歉,Nefrubyr是正确的。尖括号写错了。我已经更正了这行代码。 - John Gietzen

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

或者:

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

这是所需的全部内容。

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>

不需要复杂的正则表达式,而你提供的解决方案需要启动外部工具吗? - user80168
vim, 到shell,也是一个外部工具。无论是awk、sed、vim、ed等,所有这些工具都是对文件进行操作的!它们之间真的没有太大的区别。即使是普通的 shell 也可以用来“编辑”文件。而且不,我的解决方案并不是从 vim 启动的,如果你是这个意思的话。它们是从命令行运行的。 - ghostdog74
OP说他正在运行vim。因此调用shell/bash的内容是外部的。 - user80168
OP还使用了sed标签,这会给他带来什么好处呢?在他的情况下使用vim的缺点是文件太大。并不是说vim不能支持大文件,但如果他要编辑一个大文件,最好使用awk/sed而不是vim(交互模式)。另一个缺点是,在vim中进行编辑只能一次性完成。将编辑命令放入脚本中以便下次使用仍然更好。 - ghostdog74

0

这应该可以工作:

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

它必须以除<之外的其他内容开头,但<可以在后面。我会将+更改为*。 - user80168
我不会这样做。我的正则表达式不处理空行。就不会有<p></p>。 - Maxim Kim

0
另一种方法是:
:v/^</normal I<p>^O$</p>

^O 实际上是按下 CTRL+o 键

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

:v/^</normal yss<p>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接