简体   繁体   中英

SED's Substituted string is considered as one-line string, whereas it contains newline character

I am testing the sed command to substitute one line with 3 lines and, then, to delete the last line. (I could have substituted it with only the 2 first lines, but this is deliberately stated like this to showcase the main issue).

Let's say that I have the following text:

// ##OPTION_NAME: xxxx

I want to replace the token ##OPTION_NAME by ##OP-NAME and surround it by 2 new lines; Like so:

// ##OP-START
// ##OP-NAME: xxxx
// ##OP-END

To illustrate this, I put this text in a code.c file, and the sed commands in a sed script named script.sed .
Then, I call the following shell command:

Shell command

sed -f script.sed code.c

script.sed

# Begin by replacing patterns by their equivalents, surrounding them with ##OP-START and ##OP-END lines
s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g

The problem

Now, I add another sed command in script.sed to delete the line containing ##OP-END . Surprise ! all 3 lines are removed !

# Begin by replacing patterns by their equivalents, surrounding them with ##OP-START and ##OP-END lines
s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g

# Last parse; delete ##OP-END
/##OP-END/d

I tried \r\n instead of \n in the sustitution command s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g , but it does not work.

I also tested on ##OP-START to see if it makes some difference, but alas. All 3 lines were removed too.

It seems that sed is considering it as one line !

This is not a surprise, d operates on the pattern space , not on a per line basis. After the modification with the s command, your pattern space contains 3 lines. The content of it matches the expression and gets therefore deleted.

To delete this line from the pattern space, you need to use the s command again:

s/\(.*\)##OPTION_NAME:\(.*\)/\1##OP-START\n\1##OP-NAME:\2\n\1##OP-END/g$
s/\n\/\/ ##OP-END//

About pattern and hold space: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html#tag_20_116_13

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM