Delete all lines not starting with a special phrase

Help with writing and playing macros

Delete all lines not starting with a special phrase

Postby thomasm76 » Tue Jun 20, 2006 12:15 pm

Hi,
Since I'm a newbie I'm not sure how to write a Macro for my problem:
Just keep the lines starting with a special phrase. (If the phrase is in the middle of a line: delete line too)

Before:
This is Line 1
And another Line 2
Again another Line3
Starting phrase blablabla1
Starting phrase blabla2
Another Line 4

After:
Starting phrase blablabla1
Starting phrase blabla2
User avatar
thomasm76
Basic User
Basic User
 
Posts: 19
Joined: Sun Jun 18, 2006 11:00 pm

Re: Delete all lines not starting with a special phrase

Postby Mofi » Tue Jun 20, 2006 1:51 pm

Not need to do this with a macro. Use the Find dialog with following UltraEdit style regex search string %Starting phrase and enable also List Lines Containing String.

In the dialog shown after clicking on the Find button, click on Clipboard to copy all the lines found with the starting phrase to the clipboard and Close the dialog. Next select all with Ctrl+A and paste the lines found.

But if you want to do it with a macro because you need this regularly, use the following macro with macro property Continue if a Find with Replace not found enabled.

InsertMode
ColumnModeOff
HexOff
UnixReOff
Clipboard 9
ClearClipboard
Top
Loop
Find MatchCase RegExp "%Starting phrase*^p"
IfFound
CopyAppend
Else
ExitLoop
EndIf
EndLoop
SelectAll
Paste
Top
ClearClipboard
Clipboard 0

Add UnixReOn or PerlReOn (v12+ of UE) at the end of the macro if you do not use UltraEdit style regular expressions by default - see search configuration. Macro command UnixReOff sets the regular expression option to UltraEdit style.

Note: If your starting phrase contains UltraEdit style regular expression characters you must escape it with the ^ character.


Here is a more complex one which asks you for the starting phrase and automatically escapes UE style regex characters.

InsertMode
ColumnModeOff
HexOff
UnixReOff
Bottom
IfColNum 1
Else
"
"
EndIf
Top
Clipboard 8
GetString "Enter the starting phrase:"
"
"
SelectToTop
Find RegExp "^([^$^%^*^+^.^?^[^]^^]^)"
Replace All SelectText "^^^^^^1"
EndSelect
Top
StartSelect
Key END
Cut
EndSelect
Key DEL
Clipboard 9
ClearClipboard
Loop
Clipboard 8
Find MatchCase RegExp "%^c*^p"
IfFound
Clipboard 9
CopyAppend
Else
ExitLoop
EndIf
EndLoop
ClearClipboard
Clipboard 9
SelectAll
Paste
ClearClipboard
Clipboard 0
User avatar
Mofi
Grand Master
Grand Master
 
Posts: 4049
Joined: Thu Jul 29, 2004 11:00 pm
Location: Vienna

Re: Delete all lines not starting with a special phrase

Postby thomasm76 » Wed Jun 21, 2006 7:41 am

Mofi, your macro works, but 3 questions:
How does you Macro know if the EOF is reached for exiting the loop (the Macro works without IfEof)?

Is there a macro which first selects all consecutive lines and copy them in one sweep to the clipboard (like I would do it manually, it's quicker than copying every single line)?

In general, is it possible to search for lines NOT containing a search-string?
(e.g: Find RegExp NOT(%Starting phrase*^p)
User avatar
thomasm76
Basic User
Basic User
 
Posts: 19
Joined: Sun Jun 18, 2006 11:00 pm

Re: Delete all lines not starting with a special phrase

Postby Mofi » Wed Jun 21, 2006 10:17 am

thomasm76 wrote:How does you Makro know if the EOF is reached for exiting the loop (the Makro works without IfEof)?

The loop in the macro is executed until no line with the starting phrase is found anymore. See

IfFound
...
Else
ExitLoop
EndIf

Many of my macros do not run till EOF, because they searches from top down until the searched string is not found anymore. Within a macro execution the configuration option Continue find at End of File is ignored. (Except if Perl engine is enabled where still user dialogs are displayed if a string is not found till EOF while executing a search in a macro loop. This is of course a bug of v12.00 till current version 12.10a.)

thomasm76 wrote:Is there a Makro which first selects all consecutive lines and copy them in one sweep to the clipboard (like I would do it manually, it's quicker than copying every single line)?


Such a block selecting code is used several times in the posted macros. For example you have found the starting phrase in a line and want to copy everything from start of this line till next blank line (without the blank line).

UnixReOff
Key HOME
IfColNumGt 1
Key HOME
EndIf
StartSelect
Find RegExp Select "^p[ ^t]++^p"
Key UP ARROW
Copy
EndSelect

If your DOS terminated file does not contain trailing spaces on blank lines (because you have used TrimTrailingSpaces at start of the macro), this can be done without regexp search:

Key HOME
IfColNumGt 1
Key HOME
EndIf
StartSelect
Find Select "^p^p"
Key UP ARROW
Copy
EndSelect

And if you have enabled the configuration setting Home Key Always Goto Column 1 a single Key HOME is also enough:

Key HOME
StartSelect
Find RegExp Select "^p^p"
Key UP ARROW
Copy
EndSelect

You see, I have to think about many problems when writing macros for general purposes posted here because I don't know the content of the file and the UE settings of the user.

thomasm76 wrote:In general, is it possible to search for lines NOT containing a search-string?
(e.g: Find RegExp NOT(%Starting phrase*^p)


As already written several times - no! Maybe with the Perl engine. I don't know too much about Perl regex. See for example How to delete lines which do not contain specific word.
User avatar
Mofi
Grand Master
Grand Master
 
Posts: 4049
Joined: Thu Jul 29, 2004 11:00 pm
Location: Vienna

Re: Delete all lines not starting with a special phrase

Postby w2q » Wed Jun 16, 2010 2:22 pm

Hi,

I am new in this and I need to know how I can delete all line in a file except those starting with 12a and 455

Ex:

12aererwerwrwer
23sdrgferf4545r
455ererwerwrwer
12athgret54553
563ee44232dddd

And I need to keep all the lines starting with : 12a and 455

Thank you.

John
w2q
Newbie
 
Posts: 2
Joined: Wed Jun 16, 2010 2:18 pm

Re: Delete all lines not starting with a special phrase

Postby Mofi » Thu Jun 17, 2010 12:46 am

This can be done with executing a Perl regular expression replace all command.

Find What: ^(?!12a|455).*\r\n
Replace With: empty

As macro code:

PerlReOn
Find RegExp "^(?!12a|455).*\r\n"
Replace All ""
User avatar
Mofi
Grand Master
Grand Master
 
Posts: 4049
Joined: Thu Jul 29, 2004 11:00 pm
Location: Vienna

Re: Delete all lines not starting with a special phrase

Postby w2q » Thu Jun 17, 2010 8:44 am

Absolutly amazing.

So easy with people who know how it's work.

Thank you.
w2q
Newbie
 
Posts: 2
Joined: Wed Jun 16, 2010 2:18 pm


Return to Macros