简体   繁体   中英

replace line that contains search pattern entirely with another line

I would like to replace every line that starts with a certain expression (example: <Output> ) with what I want the output path to be. I have found and got to work a python script that replaces one string with another, in every occurrence in a file - something like:

text = open( path ).read()
if output_pattern in text:
   open( path, 'w' ).write( text.replace( pattern, replace ) )

However I would like to replace the text.replace( pattern, replace ) with something that replaces the entire line that contains pattern with replace . I have tried some things and failed miserably.

Note: I can read but not quite write python...

One of my failures did replace the pattern with the line. Actually, it replaced the entire file with only the replace pattern, as many times as it was needed... Yeah, not funny since I was doing a recursive search (and the previous attempt, to replace one string with another, worked perfectly, so I was brave and set my target directory as the root of what I want to work with)

There are other great examples that read line by line and write to an output file, and then copy the output file to the input file, but I got an error doing that.

I don't really want to use regex because the patterns that I might want to search for (and especially what I want to replace) (may) contain many special characters including backslashes, but these could be escaped if needed.

To replace lines with replace if they start with pattern :

text = open(path).read()
new_text = '\n'.join(replace if line.startswith(pattern) else line
                                for line in text.splitlines())
open(path, 'w').write(new_text)

Or optimized for memory usage, and using the with statement, which is a bit more idiomatic:

with open(input_path) as text, open(output_path, 'w') as new_text:
    new_text.write(''.join(replace if line.startswith(pattern) else line
                                for line in text))

You'll want to make sure replace has a newline character ( \\n ) in it for the latter example to work as you'd expect.

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