replace multiple lines identifying end character

后端 未结 3 747
眼角桃花
眼角桃花 2021-01-25 02:03

I have the below code

CREATE TABLE Table1(
        column1 double NOT NULL,
        column2 varchar(60) NULL,
        column3 varchar(60) NULL,
        column4          


        
3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-01-25 02:46

    Update:

    You can use the following sed command to replace even the last , before the CONSTRAINT block:

    sed -r '/,/{N;/CONSTRAINT/{:a;N;/GO/!ba;s/([^,]+).*/\1\n)/};/CONSTRAINT/!n}' input.sql
    

    Let me explain it as a multiline script:

    # Search for a comma
    /,/ {
      # If a command was found slurp in the next line
      # and append it to the current line in pattern buffer
      N
      # If the pattern buffer does not contain the word CONSTRAINT
      # print the pattern buffer and go on with the next line of input
      # meaning start searching for a comma
      /CONSTRAINT/! n
    
      # If the pattern CONSTRAINT was found we loop until we find the 
      # word GO
      /CONSTRAINT/ {
        # Define a start label for the loop 
        :a
        # Append the next line of input to the pattern buffer
        N
        # If GO is still not found in the pattern buffern
        # step to the start label of the loop
        /GO/! ba
    
        # The loop was exited meaning the pattern GO was found.
        # We keep the first line of the pattern buffer - without
        # the comma at the end and replace everything else by a )
        s/([^,]+).*/\1\n)/
      }
    }
    

    You can save the above multiline script in a file and execute it using

    sed -rf script.sed input.sql
    

    You can use the following sed command:

    sed '/CONSTRAINT/{:a;N;/GO/!ba;s/.*/)/}' input.sql
    

    The pattern searches for a line containing /CONSTRAINT/. If the pattern is found a block of commands is started wrapped between { }. In the block we first define a label a through :a. The we get the next line of input through N and append it to the pattern buffer. Unless we find the pattern /GO/! we'll continue at label a using the branch command b. If the pattern /GO/ is found we simply replace the buffer by a ).


    An alternative can be using using a range like FredPhil suggested:

    sed '/CONSTRAINT/,/GO/{s/GO/)/;te;d;:e}'
    

提交回复
热议问题