Community
    • Login

    Replace bookmarked lines from one file to bookmarked lines in another file.

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    18 Posts 4 Posters 1.9k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • guy038G
      guy038
      last edited by guy038

      Hello, @n0stal6ic, @terry-r and All,

      I wanted to point out that, if the numbering is identical between the two files, a simple regex S/R, on file 1, should be enough.

      So, no need about a file 2, containing the new values, no need of a temporary file 3 and so on !


      For instance, given the file 1 INPUT text, below :

        <Placemark>
          <name>NAME-1</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>NAME-2</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>NAME-3</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>NAME-4</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
      

      Then the regex S/R, below, applied to file 1 :

      SEARCH <name>\KNAME-(\d+)(?=</name>)

      REPLACE NAME \1

      would produce this text :

        <Placemark>
          <name>NAME 1</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>NAME 2</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>NAME 3</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>NAME 4</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
      

      A second example, with an other regex S/R :

      SEARCH <name>\KNAME-(\d+)(?=</name>)

      REPLACE ABC-\1-XYZ

      which would give this text :

        <Placemark>
          <name>ABC-1-XYZ</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>ABC-2-XYZ</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>ABC-3-XYZ</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>ABC-4-XYZ</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
      

      Now, if I assume that your file 1 contains only four values ( 1, 12, 123 and 1234 ), here is a last example with a third regex S/R :

      SEARCH <name>\KNAME-(\d+)(?=</name>)

      REPLACE {_000\1_}

      You’re left with that text :

        <Placemark>
          <name>{_0001_}</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>{_00012_}</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>{_000123_}</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
        <Placemark>
          <name>{_0001234_}</name>
          <styleUrl>Stuff</styleUrl>
          <Point>
            <coordinates>
              Stuff
            </coordinates>
          </Point>
        </Placemark>
      

      Note that only the Replace regex is different, in each example !

      Of course, if mathematical operations must occur on values, in file 1, in order to get new values, the regex approach is useless and needs scripting !

      Best Regards,

      guy038

      1 Reply Last reply Reply Quote 1
      • L
        LarLei @Terry R
        last edited by

        Hi,

        I’m trying to adapt this to my own use case. However, I ran into the issue with:

        @Terry-R said in Replace bookmarked lines from one file to bookmarked lines in another file.:

        Find What:(?-s)^\d+\h(\d+\h)([^<]+).+\R[^<]+(.+\R)

        I tried Replace All as suggested, but it didn’t have the desired effect. Then I tried Find Next just see if the regex could find anything, but it gave an error as shown in the attached image.

        regex1.png

        Thanks,

        Terry RT 1 Reply Last reply Reply Quote 0
        • Terry RT
          Terry R @LarLei
          last edited by

          @LarLei said in Replace bookmarked lines from one file to bookmarked lines in another file.:

          but it gave an error

          Well, it’s not actually an error. It is saying there were no instances found of the text you were looking for between the caret and the last character in the file. Suggest confirming the caret (the marker pointing to where new text would be inserted if you typed some) is at the start of the file and/or use the wrap around option. Wrap around allows the whole file to be searched even if the caret is some way through the file content.

          Terry

          L 1 Reply Last reply Reply Quote 0
          • L
            LarLei @Terry R
            last edited by

            @Terry-R
            Hi,
            Fair point about not being an error.

            I copied then pasted (regex) exactly from your instruction. Should it have worked? Because it doesn’t look like it.

            Thanks,

            Terry RT 1 Reply Last reply Reply Quote 0
            • Terry RT
              Terry R @LarLei
              last edited by

              @LarLei said in Replace bookmarked lines from one file to bookmarked lines in another file.:

              Should it have worked? Because it doesn’t look like it.

              I’ve absolutely no idea. At no point have you actually outlined what it is you need to do, nor the data you are working with. Then there is the small matter of you saying “I’m trying to adapt this to my own use case” which suggests your need isn’t exactly the same as the one in the opening post.

              At this point we could go back and forwards over several (pointless) question/answer posts. Instead I would point you to the FAQ section, specifically the post (Template for Search/Replace Questions) that deals with how you should represent your need/request. From there someone on the forum might help.

              Bear in mind that often regular expressions (regex) are created for a single need. Unless someone else’s data is EXACTLY the same and the need to alter it also EXACTLY the same there will often be a need to massage the regex to suit a new request.

              Terry

              L 1 Reply Last reply Reply Quote 0
              • L
                LarLei @Terry R
                last edited by

                @Terry-R

                Hi,

                I’m trying to figure out why the regex worked for the OP and not for me. The data and regex are both from the screenshot.

                Here is the data in text format (I copied from Notepad++ as also shown from the screenshot):

                01 01 <name>NAME-1</name>
                02 <name>NAME 1</name>
                03 10 <name>NAME-2</name>
                04 <name>NAME 2</name>
                05 19 <name>NAME-3</name>
                06 <name>NAME 3</name>
                
                

                Here are the regex (copied/pasted directly from the instruction and also as shown on the screenshot:

                Find What:(?-s)^\d+\h(\d+\h)([^<]+).+\R[^<]+(.+\R)
                Replace With:\1\2\3
                

                Before adapting to my own use case, I’d like to gain a better understanding, so I’m replicating the given example/instruction step by step. Then I ran into the issue with the regex.

                Thanks,

                Terry RT 1 Reply Last reply Reply Quote 0
                • Terry RT
                  Terry R @LarLei
                  last edited by Terry R

                  @LarLei said in Replace bookmarked lines from one file to bookmarked lines in another file.:

                  Then I ran into the issue with the regex.

                  Well, the data you show above isn’t exactly as per the screen shot. There are additional spaces behind the 2nd number on 1st, 3rd and 5th lines. The data of yours above doesn’t have those additional spaces.

                  However I think I can see where it goes wrong for you as those spaces I accounted for, but not for a lack of additional spaces. Try adding a ? behind the first ([^<]+), so making it ([^<]+)?.

                  As I said, a solution like this is very specific and in order to adjust for slightly different data you must first understand what it does, especially with the original data, not a close copy.

                  Terry

                  L 1 Reply Last reply Reply Quote 2
                  • guy038G
                    guy038
                    last edited by guy038

                    Hello, @larlei, @terry-R and All,

                    Given the INPUT text :

                    01 01 <name>NAME-1</name>
                    02 <name>NAME 1</name>
                    03 10 <name>NAME-2</name>
                    04 <name>NAME 2</name>
                    05 19 <name>NAME-3</name>
                    06 <name>NAME 3</name>
                    

                    And the regex S/R :

                    • SEARCH (?-s)^\d+\h(\d+\h)([^<]+).+\R[^<]+(.+\R)

                    • REPLACE \1\2\3

                    I can affirm, like you did @larlei, that this search regex does not find any match at all, so cannot allow any replacement !

                    Of course, I could explain why this regex fails, but, to my mind, it’s not important !


                    Indeed, the main goal is that you should tell us :

                    • Which is your text and/or your files involved, as INPUT

                    • Which is the text or files expected, as OUTPUT

                    Just provide us enough raw text to possibly build a regex S/R allowing the changes

                    Be aware that, may be, you’ll need scripting to achieve your goals !

                    Best Regards,

                    guy038

                    1 Reply Last reply Reply Quote 0
                    • L
                      LarLei @Terry R
                      last edited by LarLei

                      @Terry-R

                      Thank you for the explanation! Looking at your screenshot, I now realize each dot represents a space. So I manually recreated that exact text and the regex in your instruction worked as expected.

                      I also appreciate your suggested regex to work with my data set that has only one space. I might have made some errors as I went through the instruction step by step. So I manually created a data set to resemble what I saw (didn’t realize each dot represents a space) to move forward with the testing.

                      I now have a decent understanding of this example to try to apply to my own use case. If I run into issue with Search/Replace regex, I’ll use the help template as you suggest.

                      Thanks again for your time and help!

                      @guy038

                      Thank you for your confirmation and suggestion.

                      1 Reply Last reply Reply Quote 1
                      • guy038G
                        guy038
                        last edited by

                        Hi, @larlei, @terry-R and All,

                        However, @larlei, given the same INPUT text :

                        01 01 <name>NAME-1</name>
                        02 <name>NAME 1</name>
                        03 10 <name>NAME-2</name>
                        04 <name>NAME 2</name>
                        05 19 <name>NAME-3</name>
                        06 <name>NAME 3</name>
                        

                        Then, the modified search regex of @terry-r, below, with an question mark, after the group 2 ([^<]+) :

                        • SEARCH (?-s)^\d+\h(\d+\h)([^<]+)?.+\R[^<]+(.+\R)

                        • REPLACE \1\2\3

                        Does match and, after replacement, you get the expected OUTPUT text :

                        01 <name>NAME 1</name>
                        10 <name>NAME 2</name>
                        19 <name>NAME 3</name>
                        

                        Let’s go back to the wrong syntax of the regex S/R, without the question mark. Why this regex does not find any match ? Well …

                        • From beginning of line, it searches for some digits, followed with one horizontal space character, and this twice ( the part ^\d+\h(\d+\h) )

                        • At this point, it tries to find some characters, all different from an opening tag delimiter <. But this case is impossible as an opening tag delimiter < follows, right before name>. So the overall search regex fails !

                        • Now, adding the exclamation mark, after the group 2, means that all the group contents are not mandatory. Thus, it can be ignored and the following part .+\R does match the remaining of the first line, including its like-break ( \R ) !

                        • And, indeed, I verified that, against our INPUT text, the optional group 2 ([^<]+)? is always EMPTY !


                        In other words, you can simplify your regex S/R to this syntax :

                        • SEARCH (?-s)^\d+\h(\d+\h).+\R\d+\h(.+\R)

                        • REPLACE \1\2

                        So, from the INPUT below :

                        01 01 <name>NAME-1</name>
                        02 <name>NAME 1</name>
                        03 10 <name>NAME-2</name>
                        04 <name>NAME 2</name>
                        05 19 <name>NAME-3</name>
                        06 <name>NAME 3</name>
                        

                        With this new S/R , you would get the same OUTPUT as above, i.e :

                        01 <name>NAME 1</name>
                        10 <name>NAME 2</name>
                        19 <name>NAME 3</name>
                        

                        BR

                        guy038

                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post
                        The Community of users of the Notepad++ text editor.
                        Powered by NodeBB | Contributors