Find lines that don't begin with a "<", perform action
Am using vim and have a large text file that contains some html thrown in throoghout. Am trying to prepare it for the web and need to add <p></p>
tags to the lines that are not yet formatted. Here is an example of what I have:
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!
I am looking for a way to search for the lines that don't begin with a <
character and, for those lines, add opening and closing <p></p>
tags ... so that, afterwards, my file 开发者_开发知识库resembles this:
<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>
How do I find lines that don't match a starting <
character?
^([^<].*)$
Make sure your options disallow "Dot matching newline" and replace with:
<p>$1</p>
Vim requires you to escape certain characters, but I don't actially have vim, so this is my best guess at the whole rule:
s:^\([^<].*\)$:<p>\1</p>:g
:%s/^[^<].*/<p>&<\/p>/
alternatively:
:v/^</s#.*#<p>&</p>#
that's all that is needed.
here's the logic. go through the file, check for <
at the start of the line, if not there, construct a new string with the <p>
and </p>
and echo it out. There's really no need for complicated regex
with bash
#!/bin/bash
shopt -s extglob
while read -r line
do
case "$line" in
"<"*) echo $line ;;
*) echo "<p>$line</p>";;
esac
done <"file"
with awk
$ awk '!/^</{$0="<p>"$0"</p>"}{print}' file
output
$ 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>
This should work:
:%s/^\s*[^<]\+$/<p>&<\/p>/g
Another way to do it:
:v/^</normal I<p>^O$</p>
^O is done actually pressing CTRL+o
Or, if you use the surround.vim plugin:
:v/^</normal yss<p>
精彩评论