Append text to line if begins with pattern1 AND does not end with pattern2

Hello, I'm looking for sed solution to change

...
<li>keyword</li>
<li>keyword
<li>keyword</li>
<li>keyword
<li>keyword</li>
...

to

...
<li>keyword</li>
<li>keyword</li>
<li>keyword</li>
<li>keyword</li>
<li>keyword</li>
...

I.e., if lines beginning with <li> do not end with </li>, append </li> to the end.

Does it have to be sed?

awk '/^<li>/&&!/<\/li>$/{$0=$0"</li>"}1' file
1 Like

Here you go..

[mkt@michael]$ sed '/^<li>/{
> />$/!s/$/<\/li>/
> }' inputfile
...
<li>keyword</li>
<li>keyword</li>
<li>keyword</li>
<li>keyword</li>
<li>keyword</li>
...
[mkt@michael]$

Note - highlighted > indicates line breaks in my Solaris machine.

1 Like

Hi,

If you need your code to be more generic, Try this one,

Input:

<li>keyword</li>
<a>keyword
<B>keyword</B>
<li>keyword
<li>keyword</li>
sed '/>$/! s/<\(.*\)>\(.*\)/<\1>\2<\/\1>/' file

Output:

<li>keyword</li>
<a>keyword</a>
<B>keyword</B>
<li>keyword</li>
<li>keyword</li>

Cheers,
Ranga:)

1 Like