How to detect end of line with sed
Clash Royale CLAN TAG#URR8PPP
up vote
6
down vote
favorite
I'm looking for a way to only execute replacement when the last character is a newline, using sed
.
For instance:
lettersAtEndOfLine
is replaced, but this is not:
lettersWithCharacterAfter&
Since sed
does not work well with newlines, it is not as simple as
$ sed -E "s/[a-zA-Z]*n/replace/" file.txt
How can this be accomplished?
sed regular-expression newlines
add a comment |Â
up vote
6
down vote
favorite
I'm looking for a way to only execute replacement when the last character is a newline, using sed
.
For instance:
lettersAtEndOfLine
is replaced, but this is not:
lettersWithCharacterAfter&
Since sed
does not work well with newlines, it is not as simple as
$ sed -E "s/[a-zA-Z]*n/replace/" file.txt
How can this be accomplished?
sed regular-expression newlines
add a comment |Â
up vote
6
down vote
favorite
up vote
6
down vote
favorite
I'm looking for a way to only execute replacement when the last character is a newline, using sed
.
For instance:
lettersAtEndOfLine
is replaced, but this is not:
lettersWithCharacterAfter&
Since sed
does not work well with newlines, it is not as simple as
$ sed -E "s/[a-zA-Z]*n/replace/" file.txt
How can this be accomplished?
sed regular-expression newlines
I'm looking for a way to only execute replacement when the last character is a newline, using sed
.
For instance:
lettersAtEndOfLine
is replaced, but this is not:
lettersWithCharacterAfter&
Since sed
does not work well with newlines, it is not as simple as
$ sed -E "s/[a-zA-Z]*n/replace/" file.txt
How can this be accomplished?
sed regular-expression newlines
sed regular-expression newlines
edited Jun 2 '15 at 8:02
Kusalananda
106k14209327
106k14209327
asked Jun 1 '15 at 23:43
Matthew D. Scholefield
2901313
2901313
add a comment |Â
add a comment |Â
4 Answers
4
active
oldest
votes
up vote
13
down vote
accepted
With standard sed
, you will never see a newline in the text read from a file. This is because sed
reads line by line, and there is therefore no newline at the end of the text of the current line in sed
's pattern space. In other words, sed
reads newline-delimited data, and the delimiters are not part of what a sed
script sees.
Regular expressions can be anchored at the end of the line using $
(or at the beginning, using ^
). Anchoring an expression at the start/end of a line forces it to match exactly there, and not just anywhere on the line.
If you want to replace anything matching the pattern [A-Za-z]*
at the end of the line with something, then anchoring the pattern like this:
[A-Za-z]*$
...will force it to match at the end of the line and nowhere else.
However, since [A-Za-z]*$
also matches nothing (for example, the empty string present at the end of every line), you need to force the matching of something, e.g. by specifying
[A-Za-z][A-Za-z]*$
So, your sed command line will thus be
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
I did not use the -E
switch here because it's not needed. With it, you could have written
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
It's a matter of taste.
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the+
: you CAN use it even without using extended regex, just remember to write it like+
. Sosed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNUsed
installed. And not to be forgotten: Do not use-E
, as GNUsed
does not support it.
â syntaxerror
Jun 17 '15 at 22:11
1
@syntaxerror - I think you can remove the last sentence or at least unbold it asgnu sed
definitely supports-E
.
â don_crissti
Nov 12 '15 at 1:10
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNUsed
may "silently" support-E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNUsed
won't complain if you use this option.
â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Glad you did! So at least it has been confirmed thatsed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.
â syntaxerror
Nov 15 '15 at 16:22
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support-E
.
â Wildcard
Aug 10 at 22:20
add a comment |Â
up vote
1
down vote
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
Or, the long complex unnecessary way:
I've found out, this can be done, still using sed, with the help of
tr. You can assign another character to represent the end of the line.
Another temporary character has to be used, in this case "`". Let's
use "~" to represent the end of the line:tr 'n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' 'n' <output.txt >result.txt
And then to perform the actual search and replace, use "~" rather than
"n":sed -i -E "s/[a-zA-Z]*~/replace/" result.txt
And then clean up the extra character on the other lines:
sed -i "s/~//" result.txt
Obviously, this can all be piped together resulting in something like:
tr 'n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' 'n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt
3
Not sure I understand... Why don't you just anchor to end of line with$
? e.gs/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
1
2 points: 1) You'd better use+
instead of*
since the latter allows zero letters at end of string; 2) You can use a character class[[:alpha:]]
. So:sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
1
GNU sed without the-r
option uses this regular expression syntax.
â glenn jackman
Jun 2 '15 at 1:28
add a comment |Â
up vote
0
down vote
From the (broken) code snippet you posted, you seem to want to replace the newline as well. In that case, regex anchoring by itself can't help you. The following is a solution:
sed '/[[:alpha:]]+$/N;s/[[:alpha:]]+n/replace/' your_file
Broken down:
/[a-zA-Z]+$/
means apply whatever comes inside the curlies to lines that match the regex.- The regex is the one that uses anchoring as seen in your own answer, modified to take glenn jackman's comments into account.
- Inside the curlies,
N
means "append the next line to the active buffer" (whatsed
calls the 'pattern space') - Finally the
s///
statement is your required substitution. It now works because the pattern space contains two successive lines and the newline is therefore a part of it.
add a comment |Â
up vote
0
down vote
To find the end of line, just use the $-sign:
Without end of line anchor:
sed -n '/pattern/p' file
Without end of line anchor:
sed -n '/pattern$/p' file
add a comment |Â
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
13
down vote
accepted
With standard sed
, you will never see a newline in the text read from a file. This is because sed
reads line by line, and there is therefore no newline at the end of the text of the current line in sed
's pattern space. In other words, sed
reads newline-delimited data, and the delimiters are not part of what a sed
script sees.
Regular expressions can be anchored at the end of the line using $
(or at the beginning, using ^
). Anchoring an expression at the start/end of a line forces it to match exactly there, and not just anywhere on the line.
If you want to replace anything matching the pattern [A-Za-z]*
at the end of the line with something, then anchoring the pattern like this:
[A-Za-z]*$
...will force it to match at the end of the line and nowhere else.
However, since [A-Za-z]*$
also matches nothing (for example, the empty string present at the end of every line), you need to force the matching of something, e.g. by specifying
[A-Za-z][A-Za-z]*$
So, your sed command line will thus be
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
I did not use the -E
switch here because it's not needed. With it, you could have written
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
It's a matter of taste.
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the+
: you CAN use it even without using extended regex, just remember to write it like+
. Sosed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNUsed
installed. And not to be forgotten: Do not use-E
, as GNUsed
does not support it.
â syntaxerror
Jun 17 '15 at 22:11
1
@syntaxerror - I think you can remove the last sentence or at least unbold it asgnu sed
definitely supports-E
.
â don_crissti
Nov 12 '15 at 1:10
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNUsed
may "silently" support-E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNUsed
won't complain if you use this option.
â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Glad you did! So at least it has been confirmed thatsed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.
â syntaxerror
Nov 15 '15 at 16:22
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support-E
.
â Wildcard
Aug 10 at 22:20
add a comment |Â
up vote
13
down vote
accepted
With standard sed
, you will never see a newline in the text read from a file. This is because sed
reads line by line, and there is therefore no newline at the end of the text of the current line in sed
's pattern space. In other words, sed
reads newline-delimited data, and the delimiters are not part of what a sed
script sees.
Regular expressions can be anchored at the end of the line using $
(or at the beginning, using ^
). Anchoring an expression at the start/end of a line forces it to match exactly there, and not just anywhere on the line.
If you want to replace anything matching the pattern [A-Za-z]*
at the end of the line with something, then anchoring the pattern like this:
[A-Za-z]*$
...will force it to match at the end of the line and nowhere else.
However, since [A-Za-z]*$
also matches nothing (for example, the empty string present at the end of every line), you need to force the matching of something, e.g. by specifying
[A-Za-z][A-Za-z]*$
So, your sed command line will thus be
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
I did not use the -E
switch here because it's not needed. With it, you could have written
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
It's a matter of taste.
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the+
: you CAN use it even without using extended regex, just remember to write it like+
. Sosed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNUsed
installed. And not to be forgotten: Do not use-E
, as GNUsed
does not support it.
â syntaxerror
Jun 17 '15 at 22:11
1
@syntaxerror - I think you can remove the last sentence or at least unbold it asgnu sed
definitely supports-E
.
â don_crissti
Nov 12 '15 at 1:10
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNUsed
may "silently" support-E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNUsed
won't complain if you use this option.
â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Glad you did! So at least it has been confirmed thatsed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.
â syntaxerror
Nov 15 '15 at 16:22
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support-E
.
â Wildcard
Aug 10 at 22:20
add a comment |Â
up vote
13
down vote
accepted
up vote
13
down vote
accepted
With standard sed
, you will never see a newline in the text read from a file. This is because sed
reads line by line, and there is therefore no newline at the end of the text of the current line in sed
's pattern space. In other words, sed
reads newline-delimited data, and the delimiters are not part of what a sed
script sees.
Regular expressions can be anchored at the end of the line using $
(or at the beginning, using ^
). Anchoring an expression at the start/end of a line forces it to match exactly there, and not just anywhere on the line.
If you want to replace anything matching the pattern [A-Za-z]*
at the end of the line with something, then anchoring the pattern like this:
[A-Za-z]*$
...will force it to match at the end of the line and nowhere else.
However, since [A-Za-z]*$
also matches nothing (for example, the empty string present at the end of every line), you need to force the matching of something, e.g. by specifying
[A-Za-z][A-Za-z]*$
So, your sed command line will thus be
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
I did not use the -E
switch here because it's not needed. With it, you could have written
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
It's a matter of taste.
With standard sed
, you will never see a newline in the text read from a file. This is because sed
reads line by line, and there is therefore no newline at the end of the text of the current line in sed
's pattern space. In other words, sed
reads newline-delimited data, and the delimiters are not part of what a sed
script sees.
Regular expressions can be anchored at the end of the line using $
(or at the beginning, using ^
). Anchoring an expression at the start/end of a line forces it to match exactly there, and not just anywhere on the line.
If you want to replace anything matching the pattern [A-Za-z]*
at the end of the line with something, then anchoring the pattern like this:
[A-Za-z]*$
...will force it to match at the end of the line and nowhere else.
However, since [A-Za-z]*$
also matches nothing (for example, the empty string present at the end of every line), you need to force the matching of something, e.g. by specifying
[A-Za-z][A-Za-z]*$
So, your sed command line will thus be
$ sed 's/[A-Za-z][A-Za-z]*$/replace/' file.txt
I did not use the -E
switch here because it's not needed. With it, you could have written
$ sed -E 's/[A-Za-z]+$/replace/' file.txt
It's a matter of taste.
edited Aug 10 at 20:11
answered Jun 2 '15 at 7:41
Kusalananda
106k14209327
106k14209327
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the+
: you CAN use it even without using extended regex, just remember to write it like+
. Sosed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNUsed
installed. And not to be forgotten: Do not use-E
, as GNUsed
does not support it.
â syntaxerror
Jun 17 '15 at 22:11
1
@syntaxerror - I think you can remove the last sentence or at least unbold it asgnu sed
definitely supports-E
.
â don_crissti
Nov 12 '15 at 1:10
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNUsed
may "silently" support-E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNUsed
won't complain if you use this option.
â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Glad you did! So at least it has been confirmed thatsed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.
â syntaxerror
Nov 15 '15 at 16:22
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support-E
.
â Wildcard
Aug 10 at 22:20
add a comment |Â
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the+
: you CAN use it even without using extended regex, just remember to write it like+
. Sosed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNUsed
installed. And not to be forgotten: Do not use-E
, as GNUsed
does not support it.
â syntaxerror
Jun 17 '15 at 22:11
1
@syntaxerror - I think you can remove the last sentence or at least unbold it asgnu sed
definitely supports-E
.
â don_crissti
Nov 12 '15 at 1:10
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNUsed
may "silently" support-E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNUsed
won't complain if you use this option.
â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Glad you did! So at least it has been confirmed thatsed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.
â syntaxerror
Nov 15 '15 at 16:22
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support-E
.
â Wildcard
Aug 10 at 22:20
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the
+
: you CAN use it even without using extended regex, just remember to write it like +
. So sed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNU sed
installed. And not to be forgotten: Do not use -E
, as GNU sed
does not support it.â syntaxerror
Jun 17 '15 at 22:11
Though I knew how to do that, you will get a +1 just for using the technical term for it. :) So this is called anchoring - nice to know. For up to now, I always had to paraphrase it... Another note about the
+
: you CAN use it even without using extended regex, just remember to write it like +
. So sed -e 's/[A-Za-z]+$/replace/' file.txt
will work perfectly even without GNU sed
installed. And not to be forgotten: Do not use -E
, as GNU sed
does not support it.â syntaxerror
Jun 17 '15 at 22:11
1
1
@syntaxerror - I think you can remove the last sentence or at least unbold it as
gnu sed
definitely supports -E
.â don_crissti
Nov 12 '15 at 1:10
@syntaxerror - I think you can remove the last sentence or at least unbold it as
gnu sed
definitely supports -E
.â don_crissti
Nov 12 '15 at 1:10
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNU
sed
may "silently" support -E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNU sed
won't complain if you use this option.â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Well, I thought you've been on this network long enough to know that there is no way to unbold parts of a comment (unless you rewrite it entirely). So let me correct to: GNU
sed
may "silently" support -E
, but it is not documented in the manpage (nor in the Texinfo manual (checked both)). Hence I assumed it is not supported (which was a wrong assumption, after all). Anyways, you're right, because at least GNU sed
won't complain if you use this option.â syntaxerror
Nov 15 '15 at 13:27
@don_crissti Glad you did! So at least it has been confirmed that
sed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.â syntaxerror
Nov 15 '15 at 16:22
@don_crissti Glad you did! So at least it has been confirmed that
sed
will take a particular option that has not been properly documented yet. This always comes in handy; if no one is aware about the lack of documentation, nobody will ever fix it.â syntaxerror
Nov 15 '15 at 16:22
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support
-E
.â Wildcard
Aug 10 at 22:20
@syntaxerror, see unix.stackexchange.com/a/310454/135943. Of course, if you have to work with old systems such as RHEL 5, then you'll be using a GNU sed version that doesn't support
-E
.â Wildcard
Aug 10 at 22:20
add a comment |Â
up vote
1
down vote
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
Or, the long complex unnecessary way:
I've found out, this can be done, still using sed, with the help of
tr. You can assign another character to represent the end of the line.
Another temporary character has to be used, in this case "`". Let's
use "~" to represent the end of the line:tr 'n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' 'n' <output.txt >result.txt
And then to perform the actual search and replace, use "~" rather than
"n":sed -i -E "s/[a-zA-Z]*~/replace/" result.txt
And then clean up the extra character on the other lines:
sed -i "s/~//" result.txt
Obviously, this can all be piped together resulting in something like:
tr 'n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' 'n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt
3
Not sure I understand... Why don't you just anchor to end of line with$
? e.gs/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
1
2 points: 1) You'd better use+
instead of*
since the latter allows zero letters at end of string; 2) You can use a character class[[:alpha:]]
. So:sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
1
GNU sed without the-r
option uses this regular expression syntax.
â glenn jackman
Jun 2 '15 at 1:28
add a comment |Â
up vote
1
down vote
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
Or, the long complex unnecessary way:
I've found out, this can be done, still using sed, with the help of
tr. You can assign another character to represent the end of the line.
Another temporary character has to be used, in this case "`". Let's
use "~" to represent the end of the line:tr 'n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' 'n' <output.txt >result.txt
And then to perform the actual search and replace, use "~" rather than
"n":sed -i -E "s/[a-zA-Z]*~/replace/" result.txt
And then clean up the extra character on the other lines:
sed -i "s/~//" result.txt
Obviously, this can all be piped together resulting in something like:
tr 'n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' 'n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt
3
Not sure I understand... Why don't you just anchor to end of line with$
? e.gs/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
1
2 points: 1) You'd better use+
instead of*
since the latter allows zero letters at end of string; 2) You can use a character class[[:alpha:]]
. So:sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
1
GNU sed without the-r
option uses this regular expression syntax.
â glenn jackman
Jun 2 '15 at 1:28
add a comment |Â
up vote
1
down vote
up vote
1
down vote
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
Or, the long complex unnecessary way:
I've found out, this can be done, still using sed, with the help of
tr. You can assign another character to represent the end of the line.
Another temporary character has to be used, in this case "`". Let's
use "~" to represent the end of the line:tr 'n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' 'n' <output.txt >result.txt
And then to perform the actual search and replace, use "~" rather than
"n":sed -i -E "s/[a-zA-Z]*~/replace/" result.txt
And then clean up the extra character on the other lines:
sed -i "s/~//" result.txt
Obviously, this can all be piped together resulting in something like:
tr 'n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' 'n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt
sed "s/[a-zA-Z]*$/replace/" input.txt > result.txt
Or, the long complex unnecessary way:
I've found out, this can be done, still using sed, with the help of
tr. You can assign another character to represent the end of the line.
Another temporary character has to be used, in this case "`". Let's
use "~" to represent the end of the line:tr 'n' '`' <input.txt >output.txt
sed -i "s/`/~`/" output.txt
tr '`' 'n' <output.txt >result.txt
And then to perform the actual search and replace, use "~" rather than
"n":sed -i -E "s/[a-zA-Z]*~/replace/" result.txt
And then clean up the extra character on the other lines:
sed -i "s/~//" result.txt
Obviously, this can all be piped together resulting in something like:
tr 'n' '`' <input.txt | sed -e "s/`/~`/" | tr '`' 'n' | sed -E -e "s/[a-zA-Z]*~/replace/" | sed "s/~//" > result.txt
edited Jun 1 '15 at 23:58
answered Jun 1 '15 at 23:43
Matthew D. Scholefield
2901313
2901313
3
Not sure I understand... Why don't you just anchor to end of line with$
? e.gs/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
1
2 points: 1) You'd better use+
instead of*
since the latter allows zero letters at end of string; 2) You can use a character class[[:alpha:]]
. So:sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
1
GNU sed without the-r
option uses this regular expression syntax.
â glenn jackman
Jun 2 '15 at 1:28
add a comment |Â
3
Not sure I understand... Why don't you just anchor to end of line with$
? e.gs/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
1
2 points: 1) You'd better use+
instead of*
since the latter allows zero letters at end of string; 2) You can use a character class[[:alpha:]]
. So:sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
1
GNU sed without the-r
option uses this regular expression syntax.
â glenn jackman
Jun 2 '15 at 1:28
3
3
Not sure I understand... Why don't you just anchor to end of line with
$
? e.g s/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
Not sure I understand... Why don't you just anchor to end of line with
$
? e.g s/[a-zA-Z]*$/replace/
â don_crissti
Jun 1 '15 at 23:53
1
1
2 points: 1) You'd better use
+
instead of *
since the latter allows zero letters at end of string; 2) You can use a character class [[:alpha:]]
. So: sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
2 points: 1) You'd better use
+
instead of *
since the latter allows zero letters at end of string; 2) You can use a character class [[:alpha:]]
. So: sed 's/[[:alpha:]]+$/replace/' file
â glenn jackman
Jun 2 '15 at 0:25
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
@glennjackman What's the backslash for before the plus? Wouldn't that match the addition character?
â Matthew D. Scholefield
Jun 2 '15 at 0:39
1
1
GNU sed without the
-r
option uses this regular expression syntax.â glenn jackman
Jun 2 '15 at 1:28
GNU sed without the
-r
option uses this regular expression syntax.â glenn jackman
Jun 2 '15 at 1:28
add a comment |Â
up vote
0
down vote
From the (broken) code snippet you posted, you seem to want to replace the newline as well. In that case, regex anchoring by itself can't help you. The following is a solution:
sed '/[[:alpha:]]+$/N;s/[[:alpha:]]+n/replace/' your_file
Broken down:
/[a-zA-Z]+$/
means apply whatever comes inside the curlies to lines that match the regex.- The regex is the one that uses anchoring as seen in your own answer, modified to take glenn jackman's comments into account.
- Inside the curlies,
N
means "append the next line to the active buffer" (whatsed
calls the 'pattern space') - Finally the
s///
statement is your required substitution. It now works because the pattern space contains two successive lines and the newline is therefore a part of it.
add a comment |Â
up vote
0
down vote
From the (broken) code snippet you posted, you seem to want to replace the newline as well. In that case, regex anchoring by itself can't help you. The following is a solution:
sed '/[[:alpha:]]+$/N;s/[[:alpha:]]+n/replace/' your_file
Broken down:
/[a-zA-Z]+$/
means apply whatever comes inside the curlies to lines that match the regex.- The regex is the one that uses anchoring as seen in your own answer, modified to take glenn jackman's comments into account.
- Inside the curlies,
N
means "append the next line to the active buffer" (whatsed
calls the 'pattern space') - Finally the
s///
statement is your required substitution. It now works because the pattern space contains two successive lines and the newline is therefore a part of it.
add a comment |Â
up vote
0
down vote
up vote
0
down vote
From the (broken) code snippet you posted, you seem to want to replace the newline as well. In that case, regex anchoring by itself can't help you. The following is a solution:
sed '/[[:alpha:]]+$/N;s/[[:alpha:]]+n/replace/' your_file
Broken down:
/[a-zA-Z]+$/
means apply whatever comes inside the curlies to lines that match the regex.- The regex is the one that uses anchoring as seen in your own answer, modified to take glenn jackman's comments into account.
- Inside the curlies,
N
means "append the next line to the active buffer" (whatsed
calls the 'pattern space') - Finally the
s///
statement is your required substitution. It now works because the pattern space contains two successive lines and the newline is therefore a part of it.
From the (broken) code snippet you posted, you seem to want to replace the newline as well. In that case, regex anchoring by itself can't help you. The following is a solution:
sed '/[[:alpha:]]+$/N;s/[[:alpha:]]+n/replace/' your_file
Broken down:
/[a-zA-Z]+$/
means apply whatever comes inside the curlies to lines that match the regex.- The regex is the one that uses anchoring as seen in your own answer, modified to take glenn jackman's comments into account.
- Inside the curlies,
N
means "append the next line to the active buffer" (whatsed
calls the 'pattern space') - Finally the
s///
statement is your required substitution. It now works because the pattern space contains two successive lines and the newline is therefore a part of it.
edited Apr 13 '17 at 12:37
Communityâ¦
1
1
answered Jun 2 '15 at 8:31
Joseph R.
27.2k368111
27.2k368111
add a comment |Â
add a comment |Â
up vote
0
down vote
To find the end of line, just use the $-sign:
Without end of line anchor:
sed -n '/pattern/p' file
Without end of line anchor:
sed -n '/pattern$/p' file
add a comment |Â
up vote
0
down vote
To find the end of line, just use the $-sign:
Without end of line anchor:
sed -n '/pattern/p' file
Without end of line anchor:
sed -n '/pattern$/p' file
add a comment |Â
up vote
0
down vote
up vote
0
down vote
To find the end of line, just use the $-sign:
Without end of line anchor:
sed -n '/pattern/p' file
Without end of line anchor:
sed -n '/pattern$/p' file
To find the end of line, just use the $-sign:
Without end of line anchor:
sed -n '/pattern/p' file
Without end of line anchor:
sed -n '/pattern$/p' file
answered Feb 18 at 13:27
user unknown
7,00912148
7,00912148
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f206922%2fhow-to-detect-end-of-line-with-sed%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password