Content of my filename
file is as following(for example):
My block of line starts from here
START
First line
second line
third line
END
and end to here for example.
I want to replace block of lines between START
and END
with just a single word, for example with SINGLEWORD
. Like below:
My block of line starts from here
SINGLEWORD
and end to here for example.
I can find my block of lines with using this command:
grep -Pzo "START(.|\n)*END" filename
And the result of running above command will be like this:
START
First line
second line
third line
END
Then I used this command to combine all lines into a single line:
LAST_RESULT | sed -e :a -e '/$/N; s/\n/ /; ta'
Then I will get this result:
START First line second line third line END
And with my last command LAST_RESULTS | sed 's/.*/SINGLEWORD/'
I change them to "SINGLEWORD"
and I get this result.
SINGLEWORD
Now what I want is: How can I use this command(Or your suggestion command) and replace(in place)my block of lines to "SINGLEWORD" word? And the final result will be like this file:
My block of line starts from here
SINGLEWORD
and end to here for example.
This can be done very easily in
perl
:Explanation
-0
sets the line separator to null-p
apply the script given by-e
to each line and print that lineThe regexp modifier:
/s
Treat string as single line. That is, change.
to match any character whatsoever, even a newline, which normally it would not match.Why the
?
:?
.I was wondering if this is possible without
perl
,python
and others. And I found this solution usingsed
:Explanation:
/START.*END/
bySINGLEWORD
,/g global match (as many times as it can)It was found here.
While
ripgrep
specifically doesn't support inline replacement, I've found that its current--replace
functionality is already useful for this use case:Explanation:
--replace 'SINGLEWORD'
enables replacement mode and sets the replacement string. Can include captured regex groups by using$1
etc.--passthru
is needed sinceripgrep
usually only shows the lines matching the regex pattern. With this option it also shows all lines from the file that don't match.--no-line-number / -N
is because by defaultripgrep
includes the line numbers in the output (useful when only the matching lines are shown).--multiline / -U
enabled multiline processing since it's disabled by default.--multiline-dotall
is only needed if you want the dot ('.') regex pattern to match newlines (\n
).> output.txt
is needed since inline replace isn't supported. With the--passthrough
andno-line-number
options the standard output matches the desired new file with replacements and can be saved as usual.However, this command isn't as useful for processing multiple files, as it needs to be run separately per file.