Replace only on the first matching line with sed
Using BSD sed (no GNU extensions), how can I perform an operation similar to the example provided below, but where instead of the line number, the replacement is performed on the first line in which a pattern occurs (rather than having to specify an actual number)?
Restricting to a line number
The simplest restriction is a line number.
If you wanted to delete the first number on line 3, just add a "3" before the command:
sed '3 s/[0-9][0-9]*//' <filename >newfilename
Source: http://www.grymoire.com/Unix/Sed.html#uh-26
text-processing sed osx regular-expression bsd
add a comment |
Using BSD sed (no GNU extensions), how can I perform an operation similar to the example provided below, but where instead of the line number, the replacement is performed on the first line in which a pattern occurs (rather than having to specify an actual number)?
Restricting to a line number
The simplest restriction is a line number.
If you wanted to delete the first number on line 3, just add a "3" before the command:
sed '3 s/[0-9][0-9]*//' <filename >newfilename
Source: http://www.grymoire.com/Unix/Sed.html#uh-26
text-processing sed osx regular-expression bsd
Please edit your question and give us an example input and the output you would like to see. It seems like you are just asking how you can replace only the first occurrence of a string in a file but it's hard to understand without an example.
– terdon♦
Dec 20 '15 at 22:59
@terdon "It seems like you are just asking how you can replace only the first occurrence of a string in a file.." Yes, exactly. That's correct.
– tjt263
Dec 20 '15 at 23:05
OK. So, please edit your question and add an example input and the output you would like to see with it.
– terdon♦
Dec 20 '15 at 23:09
2
That's question 4.11 of the sed FAQ
– Stéphane Chazelas
Dec 20 '15 at 23:22
add a comment |
Using BSD sed (no GNU extensions), how can I perform an operation similar to the example provided below, but where instead of the line number, the replacement is performed on the first line in which a pattern occurs (rather than having to specify an actual number)?
Restricting to a line number
The simplest restriction is a line number.
If you wanted to delete the first number on line 3, just add a "3" before the command:
sed '3 s/[0-9][0-9]*//' <filename >newfilename
Source: http://www.grymoire.com/Unix/Sed.html#uh-26
text-processing sed osx regular-expression bsd
Using BSD sed (no GNU extensions), how can I perform an operation similar to the example provided below, but where instead of the line number, the replacement is performed on the first line in which a pattern occurs (rather than having to specify an actual number)?
Restricting to a line number
The simplest restriction is a line number.
If you wanted to delete the first number on line 3, just add a "3" before the command:
sed '3 s/[0-9][0-9]*//' <filename >newfilename
Source: http://www.grymoire.com/Unix/Sed.html#uh-26
text-processing sed osx regular-expression bsd
text-processing sed osx regular-expression bsd
edited Dec 24 '15 at 15:53
tjt263
asked Dec 20 '15 at 22:40
tjt263tjt263
5571520
5571520
Please edit your question and give us an example input and the output you would like to see. It seems like you are just asking how you can replace only the first occurrence of a string in a file but it's hard to understand without an example.
– terdon♦
Dec 20 '15 at 22:59
@terdon "It seems like you are just asking how you can replace only the first occurrence of a string in a file.." Yes, exactly. That's correct.
– tjt263
Dec 20 '15 at 23:05
OK. So, please edit your question and add an example input and the output you would like to see with it.
– terdon♦
Dec 20 '15 at 23:09
2
That's question 4.11 of the sed FAQ
– Stéphane Chazelas
Dec 20 '15 at 23:22
add a comment |
Please edit your question and give us an example input and the output you would like to see. It seems like you are just asking how you can replace only the first occurrence of a string in a file but it's hard to understand without an example.
– terdon♦
Dec 20 '15 at 22:59
@terdon "It seems like you are just asking how you can replace only the first occurrence of a string in a file.." Yes, exactly. That's correct.
– tjt263
Dec 20 '15 at 23:05
OK. So, please edit your question and add an example input and the output you would like to see with it.
– terdon♦
Dec 20 '15 at 23:09
2
That's question 4.11 of the sed FAQ
– Stéphane Chazelas
Dec 20 '15 at 23:22
Please edit your question and give us an example input and the output you would like to see. It seems like you are just asking how you can replace only the first occurrence of a string in a file but it's hard to understand without an example.
– terdon♦
Dec 20 '15 at 22:59
Please edit your question and give us an example input and the output you would like to see. It seems like you are just asking how you can replace only the first occurrence of a string in a file but it's hard to understand without an example.
– terdon♦
Dec 20 '15 at 22:59
@terdon "It seems like you are just asking how you can replace only the first occurrence of a string in a file.." Yes, exactly. That's correct.
– tjt263
Dec 20 '15 at 23:05
@terdon "It seems like you are just asking how you can replace only the first occurrence of a string in a file.." Yes, exactly. That's correct.
– tjt263
Dec 20 '15 at 23:05
OK. So, please edit your question and add an example input and the output you would like to see with it.
– terdon♦
Dec 20 '15 at 23:09
OK. So, please edit your question and add an example input and the output you would like to see with it.
– terdon♦
Dec 20 '15 at 23:09
2
2
That's question 4.11 of the sed FAQ
– Stéphane Chazelas
Dec 20 '15 at 23:22
That's question 4.11 of the sed FAQ
– Stéphane Chazelas
Dec 20 '15 at 23:22
add a comment |
2 Answers
2
active
oldest
votes
{ sed -Ee'/[0-9]+/{s///;q;}'; cat; } <in >out
^should work w/ a BSD sed
. but apparently it doesn't.
and so:
sed -e'/[0-9][0-9]*/{s///;:b' -e'n;bb' -e} <in >out
...should work with any of them.
1
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can runsed
understdbuf -i 1
to work around it (would read the input one byte at a time though)
– Stéphane Chazelas
Dec 20 '15 at 23:33
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
1
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one usesN
instead ofn
(which would slurp the rest of the file in the pattern space).
– Stéphane Chazelas
Dec 20 '15 at 23:55
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
add a comment |
This works perfectly:
sed '1,/abc/s/abc/xyz/' file.txt
Can be abbreviated to:
sed '1,/abc/s//xyz/' file.txt
Compatible with GNU & BSD:
sed '1,/[0-9][0-9]*/s///' <filename >newfilename
1
That doesn't work (could run thats
command on more than one line) if the first match is on the first line (as noted in the FAQ)
– Stéphane Chazelas
Dec 21 '15 at 11:08
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
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
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f250603%2freplace-only-on-the-first-matching-line-with-sed%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
{ sed -Ee'/[0-9]+/{s///;q;}'; cat; } <in >out
^should work w/ a BSD sed
. but apparently it doesn't.
and so:
sed -e'/[0-9][0-9]*/{s///;:b' -e'n;bb' -e} <in >out
...should work with any of them.
1
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can runsed
understdbuf -i 1
to work around it (would read the input one byte at a time though)
– Stéphane Chazelas
Dec 20 '15 at 23:33
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
1
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one usesN
instead ofn
(which would slurp the rest of the file in the pattern space).
– Stéphane Chazelas
Dec 20 '15 at 23:55
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
add a comment |
{ sed -Ee'/[0-9]+/{s///;q;}'; cat; } <in >out
^should work w/ a BSD sed
. but apparently it doesn't.
and so:
sed -e'/[0-9][0-9]*/{s///;:b' -e'n;bb' -e} <in >out
...should work with any of them.
1
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can runsed
understdbuf -i 1
to work around it (would read the input one byte at a time though)
– Stéphane Chazelas
Dec 20 '15 at 23:33
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
1
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one usesN
instead ofn
(which would slurp the rest of the file in the pattern space).
– Stéphane Chazelas
Dec 20 '15 at 23:55
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
add a comment |
{ sed -Ee'/[0-9]+/{s///;q;}'; cat; } <in >out
^should work w/ a BSD sed
. but apparently it doesn't.
and so:
sed -e'/[0-9][0-9]*/{s///;:b' -e'n;bb' -e} <in >out
...should work with any of them.
{ sed -Ee'/[0-9]+/{s///;q;}'; cat; } <in >out
^should work w/ a BSD sed
. but apparently it doesn't.
and so:
sed -e'/[0-9][0-9]*/{s///;:b' -e'n;bb' -e} <in >out
...should work with any of them.
edited Dec 20 '15 at 23:56
Stéphane Chazelas
309k57582942
309k57582942
answered Dec 20 '15 at 23:18
mikeservmikeserv
45.8k668160
45.8k668160
1
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can runsed
understdbuf -i 1
to work around it (would read the input one byte at a time though)
– Stéphane Chazelas
Dec 20 '15 at 23:33
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
1
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one usesN
instead ofn
(which would slurp the rest of the file in the pattern space).
– Stéphane Chazelas
Dec 20 '15 at 23:55
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
add a comment |
1
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can runsed
understdbuf -i 1
to work around it (would read the input one byte at a time though)
– Stéphane Chazelas
Dec 20 '15 at 23:33
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
1
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one usesN
instead ofn
(which would slurp the rest of the file in the pattern space).
– Stéphane Chazelas
Dec 20 '15 at 23:55
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
1
1
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can run
sed
under stdbuf -i 1
to work around it (would read the input one byte at a time though)– Stéphane Chazelas
Dec 20 '15 at 23:33
Doesn't work on FreeBSD 10 even on seekable input. On FreeBSD, you can run
sed
under stdbuf -i 1
to work around it (would read the input one byte at a time though)– Stéphane Chazelas
Dec 20 '15 at 23:33
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
@StéphaneChazelas - weird. should work on a Mac, though. I would think - it has the stamp.
– mikeserv
Dec 20 '15 at 23:40
1
1
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (
q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one uses N
instead of n
(which would slurp the rest of the file in the pattern space).– Stéphane Chazelas
Dec 20 '15 at 23:55
To clarify, now that the answer was edited with a second, portable solution, it's the first one that doesn't work on FreeBSD 10 (though should on seekable files if FreeBSD were POSIX (
q
leaving the cursor in the right place)), the second one is even better than the solution given in the FAQ as the FAQ one uses N
instead of n
(which would slurp the rest of the file in the pattern space).– Stéphane Chazelas
Dec 20 '15 at 23:55
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
@StéphaneChazelas - I noticed that as well, which is why I didn't delete it - though I thought at first I would. thanks again, sc.
– mikeserv
Dec 21 '15 at 0:01
add a comment |
This works perfectly:
sed '1,/abc/s/abc/xyz/' file.txt
Can be abbreviated to:
sed '1,/abc/s//xyz/' file.txt
Compatible with GNU & BSD:
sed '1,/[0-9][0-9]*/s///' <filename >newfilename
1
That doesn't work (could run thats
command on more than one line) if the first match is on the first line (as noted in the FAQ)
– Stéphane Chazelas
Dec 21 '15 at 11:08
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
add a comment |
This works perfectly:
sed '1,/abc/s/abc/xyz/' file.txt
Can be abbreviated to:
sed '1,/abc/s//xyz/' file.txt
Compatible with GNU & BSD:
sed '1,/[0-9][0-9]*/s///' <filename >newfilename
1
That doesn't work (could run thats
command on more than one line) if the first match is on the first line (as noted in the FAQ)
– Stéphane Chazelas
Dec 21 '15 at 11:08
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
add a comment |
This works perfectly:
sed '1,/abc/s/abc/xyz/' file.txt
Can be abbreviated to:
sed '1,/abc/s//xyz/' file.txt
Compatible with GNU & BSD:
sed '1,/[0-9][0-9]*/s///' <filename >newfilename
This works perfectly:
sed '1,/abc/s/abc/xyz/' file.txt
Can be abbreviated to:
sed '1,/abc/s//xyz/' file.txt
Compatible with GNU & BSD:
sed '1,/[0-9][0-9]*/s///' <filename >newfilename
edited 4 hours ago
Spooky
20126
20126
answered Dec 21 '15 at 10:37
tjt263tjt263
5571520
5571520
1
That doesn't work (could run thats
command on more than one line) if the first match is on the first line (as noted in the FAQ)
– Stéphane Chazelas
Dec 21 '15 at 11:08
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
add a comment |
1
That doesn't work (could run thats
command on more than one line) if the first match is on the first line (as noted in the FAQ)
– Stéphane Chazelas
Dec 21 '15 at 11:08
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
1
1
That doesn't work (could run that
s
command on more than one line) if the first match is on the first line (as noted in the FAQ)– Stéphane Chazelas
Dec 21 '15 at 11:08
That doesn't work (could run that
s
command on more than one line) if the first match is on the first line (as noted in the FAQ)– Stéphane Chazelas
Dec 21 '15 at 11:08
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
(Yeah, okay, we get it - You've read the FAQ.) If theres a match on the first line; the question is irrelevant, so thats fine.
– tjt263
Jan 4 '16 at 7:25
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
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
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f250603%2freplace-only-on-the-first-matching-line-with-sed%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
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
Required, but never shown
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
Required, but never shown
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
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Please edit your question and give us an example input and the output you would like to see. It seems like you are just asking how you can replace only the first occurrence of a string in a file but it's hard to understand without an example.
– terdon♦
Dec 20 '15 at 22:59
@terdon "It seems like you are just asking how you can replace only the first occurrence of a string in a file.." Yes, exactly. That's correct.
– tjt263
Dec 20 '15 at 23:05
OK. So, please edit your question and add an example input and the output you would like to see with it.
– terdon♦
Dec 20 '15 at 23:09
2
That's question 4.11 of the sed FAQ
– Stéphane Chazelas
Dec 20 '15 at 23:22