Find and select multiple lines to change order
-
I am trying to figure out how to re-arrange a given set of lines. For example: using regex / part of a macro
Connection Lost to Camera
Camera Name1
Camera Name2
Account: Customer NameThen reorganize it as such:
Account: Customer Name - Camera Name1 - Connection Lost to Camera
Account: Customer Name - Camera Name2 - Connection Lost to CameraThe tricky part is there could be anywhere from one line with Camera name to 20 lines with names. I would want to do this in groups or sets, for example the actual page may look like this:
Connection Lost to Camera
Camera Name1
Camera Name2
Account: Customer NameVideo Return
Camera Name1
Camera Name2
Account: Customer NameConnection Lost to Camera
Camera Name1
Camera Name2
Account: Customer NameWhen there is an empty line, that will start a new set. Note some start lines will be different ie, Video Return. That would be treated the same as a new set and arranged similarly.
-
Hello, @victor-fansler and All,
Here’s a solution which needs
2
consecutive regexes S/R :-)
So, let’s start with this INPUT text that you paste in a
new
tab :Connection Lost to Camera Camera Name1 Camera Name2 Camera Name3 Account: Customer Name Video Return Camera Name1 Account: Customer Name Fatal Error Camera Name1 Camera Name2 Camera Name3 Camera Name4 Camera Name5 Camera Name6 Camera Name7 Account: Customer Name
-
Open the
Replace
dialog (Ctrl + H
) -
SEARCH
(?-s)^(.+\R)((?:.+\R)+)
-
REPLACE
\2\1
-
Un-tick all the options
-
Tick the
Wrap around
option -
Select the
Regular expression
search mode -
Click on the
Replace All
button ( or several times on theReplace All
button )
=> The first line of each block/set ( message ) is moved is order to be the last line of the block/set, as shown below :
Camera Name1 Camera Name2 Camera Name3 Account: Customer Name Connection Lost to Camera Camera Name1 Account: Customer Name Video Return Camera Name1 Camera Name2 Camera Name3 Camera Name4 Camera Name5 Camera Name6 Camera Name7 Account: Customer Name Fatal Error
Then :
-
Re-open or go back to the
Replace
dialog (Ctrl + H
) -
SEARCH
(?-s)^Camera .+(?=\R(?:.+\R)*(Account: .+)\R(.+))|^Account(.+\R){2}
-
REPLACE
?1\1 - $0 - \2
-
Click on the
Replace All
button ( or several times on theReplace All
button )-
=> Each line, beginning with
Camera
is changed asAccount: Customer Name - Camera Name - Error or Info Message
-
=> And the last
2
lines of each block/set ( Account: and Error message ) are deleted from current block/set
-
And you get the expected OUTPUT list :
Account: Customer Name - Camera Name1 - Connection Lost to Camera Account: Customer Name - Camera Name2 - Connection Lost to Camera Account: Customer Name - Camera Name3 - Connection Lost to Camera Account: Customer Name - Camera Name1 - Video Return Account: Customer Name - Camera Name1 - Fatal Error Account: Customer Name - Camera Name2 - Fatal Error Account: Customer Name - Camera Name3 - Fatal Error Account: Customer Name - Camera Name4 - Fatal Error Account: Customer Name - Camera Name5 - Fatal Error Account: Customer Name - Camera Name6 - Fatal Error Account: Customer Name - Camera Name7 - Fatal Error
Best Regards
guy038
-
-
@guy038 Thanks, the first part works great, but the second part does not. I may not have made it clear, but the line’s “Camera Name” can be anything, they do not actually say “Camera Name”. Then once they are all combined, I will do an addition search that I can easily do, which is to remove the text "Account: " from the beginning of each line. Do a sort of the entire page to group them by Customer name/ Camera name. Again, I can handle the last two parts, just adding for the big picture, or if your solution has a way to do the additional steps in less steps overall.
-
@Victor-Fansler said in Find and select multiple lines to change order:
. I may not have made it clear, but the line’s “Camera Name” can be anything, they do not actually say “Camera Name”.
I have an idea, but as not on the PC I will present the concept.
- Combine the set together on 1 line by using the empty line between sets to identify them using a special character (or 2) when combining to be used in subsequent steps.
- The second regex would be run repeatedly until no changes made by copying the line to below the original, but with only the last camera name, also removing that from the original line at the same time. So not an exact copy.
- Tidy up the lines by formatting as required, although this may get possible in step 2.
Terry
-
Hi, @victor-fansler, @terry-r and All,
Ah…OK ! But I think, Victor, that the best way would be to show us a list of, let’s say,
4
to10
initial blocks, as well as the expected layout of these blocks, AFTER modifications !
Anyway, I give it a new try ! So, starting with this text :
Connection Lost to Camera Line 3 of Set 1 Line 2 of Set 1 Line 1 of Set 1 Account: Christopher Video Return Line 1 of Set 2 Account: Margaret Fatal Error Line 1 of Set 3 Line 6 of Set 3 Line 2 of Set 3 Line 5 of Set 3 Camera Name 0 Line 7 of Set 3 Line 3 of Set 3 Account: Elton
With the regex S/R below :
-
SEARCH
(?-s)^(.+\R)((?:.+\R)+)
-
REPLACE
\2\1
We first get, as before, the following OUTPUT :
Line 3 of Set 1 Line 2 of Set 1 Line 1 of Set 1 Account: Christopher Connection Lost to Camera Line 1 of Set 2 Account: Margaret Video Return Line 1 of Set 3 Line 6 of Set 3 Line 2 of Set 3 Line 5 of Set 3 Camera Name 0 Line 7 of Set 3 Line 3 of Set 3 Account: Elton Fatal Error
Then, with this second S/R, slightly modified :
-
SEARCH
(?-s)^.+(?=\R(?:.+\R)*Account: (.+)\R(.+)\R)|^(.+\R){2}(?=^\R)
-
REPLACE
?1\1 - $0 - \2
You should get your expected text :
Christopher - Line 3 of Set 1 - Connection Lost to Camera Christopher - Line 2 of Set 1 - Connection Lost to Camera Christopher - Line 1 of Set 1 - Connection Lost to Camera Margaret - Line 1 of Set 2 - Video Return Elton - Line 1 of Set 3 - Fatal Error Elton - Line 6 of Set 3 - Fatal Error Elton - Line 2 of Set 3 - Fatal Error Elton - Line 5 of Set 3 - Fatal Error Elton - Camera Name 0 - Fatal Error Elton - Line 7 of Set 3 - Fatal Error Elton - Line 3 of Set 3 - Fatal Error
And, after a classical alphabetical sort, we obtain :
Christopher - Line 1 of Set 1 - Connection Lost to Camera Christopher - Line 2 of Set 1 - Connection Lost to Camera Christopher - Line 3 of Set 1 - Connection Lost to Camera Elton - Camera Name 0 - Fatal Error Elton - Line 1 of Set 3 - Fatal Error Elton - Line 2 of Set 3 - Fatal Error Elton - Line 3 of Set 3 - Fatal Error Elton - Line 5 of Set 3 - Fatal Error Elton - Line 6 of Set 3 - Fatal Error Elton - Line 7 of Set 3 - Fatal Error Margaret - Line 1 of Set 2 - Video Return
I hope that this new layout meets your needs :-))
BR
guy038
-
-
@guy038 said in Find and select multiple lines to change order:
?1\1 - $0 - \2
Thanks, that works. Needs a little cleanup afterwards, but I can deal with that. For some reason it did not remove the last two lines (Account and Connection lost), in the document.
I wanted to send an actual example of the file, but can’t really share the real information.
Have a Great Weekend!!
-
Hello, @victor-fansler, @terry-r and All,
Aaarrrgggh ! Always this damn problem of texts that do not end with a last line break !
So, before running the regexes, just be sure that your current file ends with a final line-break (
View > Show Symbol > Show All Characters
)I also, realized that my second regex did not take in account such a possibility !
Indeed, in the last alternative of my second regex, the part
^(.+\R){2}(?=^\R)
searches for2
complete lines, with their line-breaks (CRLF
) but ONLY IF it is followed with a pure blank lineSo, either :
- Use my previous second search regex
(?-s)^.+(?=\R(?:.+\R)*Account: (.+)\R(.+)\R)|^(.+\R){2}(?=^\R)
and your current file must end this way :
SECOND to last lineCRLF LAST NON-empty lineCRLF CRLF
- Or use this new search version
(?-s)^.+(?=\R(?:.+\R)*Account: (.+)\R(.+)\R)|^(.+\R){2}(?=^\R|\z)
and your current file could simply end as below :
SECOND to last lineCRLF LAST NON-empty ineCRLF
BR
guy038
- Use my previous second search regex
-
@guy038 said in Find and select multiple lines to change order:
Always this damn problem of texts that do not end with a last line break !
I gave up dealing with that problem long ago when I started to use the editorconfig plugin. With it you can specify that files should always end with an line-ending sequence.
Too bad that isn’t a native feature of Notepad++.
-
Hello @victor-fansler, @terry-r, @alan-kilborn and All,
You said, in your chat message :
The “Camera” is a placeholder and can be any text, but will end with a Date and Time
So I suppose that all these lines always end with the three uppercase letters
PST
If this assumption is right, here are new versions of the regexes ( The first and second one ). Note also that I improved these regexes :
Now, you don’t even need to separate any section with blank line(s) ;-))
So starting with your INPUT text, where I added some empty lines :
Video Return Camera-1 02/14/2022 08:31AM PST Account: Customer Name - Server Name Video Return Camera-1 02/14/2022 02:27AM PST Account: Customer Name - Server Name Connection Lost to Camera Camera-1 02/14/2022 12:25AM PST Account: Customer Name - Server Name Video Return Camera-1 02/14/2022 12:23AM PST Account: Customer Name - Server Name Video Return Camera-1 02/13/2022 09:31AM PST Camera-4 02/13/2022 09:31AM PST Camera-2 02/13/2022 09:31AM PST Camera-3 02/13/2022 09:31AM PST Account: Customer Name - Server Name Video Return Camera-1 02/13/2022 04:57AM PST Camera-4 02/13/2022 04:57AM PST Camera-3 02/13/2022 04:57AM PST Account: Customer Name - Server Name Connection Lost to Camera Camera-2 02/13/2022 01:43AM PST Account: Customer Name - Server Name Video Return Camera-1 02/13/2022 01:42AM PST Camera-4 02/13/2022 01:42AM PST Camera-2 02/13/2022 01:42AM PST Camera-3 02/13/2022 01:42AM PST Account: Customer Name - Server Name Connection Lost to Camera Camera-1 02/12/2022 07:18PM PST Camera-4 02/12/2022 07:18PM PST Camera-2 02/12/2022 07:18PM PST Camera-3 02/12/2022 07:18PM PST Account: Customer Name - Server Name
First, use the following regex S/R in order to place the line
Video Return
ORConnection Lost to Camera
, after each lineAccount :
SEARCH
(?-s)^(.+\R)((?:.+\R)+?Account: .+\R)\R*
REPLACE
\2\1
We get this text :
Camera-1 02/14/2022 08:31AM PST Account: Customer Name - Server Name Video Return Camera-1 02/14/2022 02:27AM PST Account: Customer Name - Server Name Video Return Camera-1 02/14/2022 12:25AM PST Account: Customer Name - Server Name Connection Lost to Camera Camera-1 02/14/2022 12:23AM PST Account: Customer Name - Server Name Video Return Camera-1 02/13/2022 09:31AM PST Camera-4 02/13/2022 09:31AM PST Camera-2 02/13/2022 09:31AM PST Camera-3 02/13/2022 09:31AM PST Account: Customer Name - Server Name Video Return Camera-1 02/13/2022 04:57AM PST Camera-4 02/13/2022 04:57AM PST Camera-3 02/13/2022 04:57AM PST Account: Customer Name - Server Name Video Return Camera-2 02/13/2022 01:43AM PST Account: Customer Name - Server Name Connection Lost to Camera Camera-1 02/13/2022 01:42AM PST Camera-4 02/13/2022 01:42AM PST Camera-2 02/13/2022 01:42AM PST Camera-3 02/13/2022 01:42AM PST Account: Customer Name - Server Name Video Return Camera-1 02/12/2022 07:18PM PST Camera-4 02/12/2022 07:18PM PST Camera-2 02/12/2022 07:18PM PST Camera-3 02/12/2022 07:18PM PST Account: Customer Name - Server Name Connection Lost to Camera
Now, using this second regex S/R :
SEARCH
(?-is)^.+PST(?=\R(?:.+PST\R)*?(Account: .+)\R(.+)\R)|^(.+\R){2}
REPLACE
?1\1 - $0 - \2
We get the OUTPUT text :
Account: Customer Name - Server Name - Camera-1 02/14/2022 08:31AM PST - Video Return Account: Customer Name - Server Name - Camera-1 02/14/2022 02:27AM PST - Video Return Account: Customer Name - Server Name - Camera-1 02/14/2022 12:25AM PST - Connection Lost to Camera Account: Customer Name - Server Name - Camera-1 02/14/2022 12:23AM PST - Video Return Account: Customer Name - Server Name - Camera-1 02/13/2022 09:31AM PST - Video Return Account: Customer Name - Server Name - Camera-4 02/13/2022 09:31AM PST - Video Return Account: Customer Name - Server Name - Camera-2 02/13/2022 09:31AM PST - Video Return Account: Customer Name - Server Name - Camera-3 02/13/2022 09:31AM PST - Video Return Account: Customer Name - Server Name - Camera-1 02/13/2022 04:57AM PST - Video Return Account: Customer Name - Server Name - Camera-4 02/13/2022 04:57AM PST - Video Return Account: Customer Name - Server Name - Camera-3 02/13/2022 04:57AM PST - Video Return Account: Customer Name - Server Name - Camera-2 02/13/2022 01:43AM PST - Connection Lost to Camera Account: Customer Name - Server Name - Camera-1 02/13/2022 01:42AM PST - Video Return Account: Customer Name - Server Name - Camera-4 02/13/2022 01:42AM PST - Video Return Account: Customer Name - Server Name - Camera-2 02/13/2022 01:42AM PST - Video Return Account: Customer Name - Server Name - Camera-3 02/13/2022 01:42AM PST - Video Return Account: Customer Name - Server Name - Camera-1 02/12/2022 07:18PM PST - Connection Lost to Camera Account: Customer Name - Server Name - Camera-4 02/12/2022 07:18PM PST - Connection Lost to Camera Account: Customer Name - Server Name - Camera-2 02/12/2022 07:18PM PST - Connection Lost to Camera Account: Customer Name - Server Name - Camera-3 02/12/2022 07:18PM PST - Connection Lost to Camera
I hope that it is your expected text !?
See you later !
Best Regards,
guy038
-
Is there a special reason for the recent revisit to something asked 5 months ago? Just asking…in case I am missing some sort of newly discovered technique…
-
Hi, @alan-kilborn,
Well, it’s just that we cannot place more than
1,000
characters in a chat message. So I preferred to answer in our forum !But, indeed, I was asked to create a new post or to continue with that one !
I have just re-indicated to @victor-fansler, the title of this article
BR
guy038
-
@guy038 said in Find and select multiple lines to change order:
But, indeed, I was asked to create a new post or to continue with that one !
Ah, OK, makes sense! I wasn’t sure your previous use of “chat” really meant that or just conversation above in this thread.
Chat is useful if something really gets specific to an OP’s need and really can’t benefit anyone else. Otherwise it is good to see the conversation in a real post.
-
@alan-kilborn said in Find and select multiple lines to change order:
I gave up dealing with that problem long ago when I started to use the editorconfig plugin. With it you can specify that files should always end with an line-ending sequence.
I would have thought you’d have a PythonScript for that! :-)
Cheers.
-
@michael-vincent said in Find and select multiple lines to change order:
I would have thought you’d have a PythonScript for that
It would be an easy script, but I don’t tend to re-invent the wheel unless I’m going to make the wheel better. And editorconfig works just fine in this regard, so…just keep rollin’.
-
@michael-vincent said in Find and select multiple lines to change order:
…PythonScript for that…
Well… I looked into my folder of “retired” scripts and I found that I used to use the SCOTT SCRIPT for doing it before I discovered the editorconfig plugin.
-
@guy038 Thanks for this and sorry for any confusion. Unfortunately, the lines will not always end with PST. There are different time zones. Primarily PST and MST, but could be MDT as well.
-
You really have to stop moving the goal posts. :) Poor @guy038 must have a real life, even if he does love doing this stuff, I suspect he’d like to fix it once and move on. :)
Lee
-
Hi, @darthdata and All,
In this case, change the second regex S/R into this one :
SEARCH
(?-is)^.+(?:PST|MST|MDT)(?=\R(?:.+(?:PST|MST|MDT)\R)*?(Account: .+)\R(.+))|^(.+\R){2}
REPLACE
?1\1 - $0 - \2
BR
guy038