Manipulating text in first column only?
up vote
4
down vote
favorite
Example Input:
foobar@example.com foo@example.com,bar@example.com
Example Output:
foobar@example.org foo@example.com,bar@example.com
So, in "normal" circumstances, it would obviously be easy to do something like:
sed 's/.com/.org/g'
But obviously in this case, I only want the suffix in the first column to be manipulated, I want the second column to be left untouched.
I don't mind what tool you propose to use. But I prefer it to available on a standard linux without needing further install (i.e. something like sed
or awk
or perl
would be more preferable to bobsobscuretoolthatneedsinstalling
).
text-processing awk sed perl
add a comment |
up vote
4
down vote
favorite
Example Input:
foobar@example.com foo@example.com,bar@example.com
Example Output:
foobar@example.org foo@example.com,bar@example.com
So, in "normal" circumstances, it would obviously be easy to do something like:
sed 's/.com/.org/g'
But obviously in this case, I only want the suffix in the first column to be manipulated, I want the second column to be left untouched.
I don't mind what tool you propose to use. But I prefer it to available on a standard linux without needing further install (i.e. something like sed
or awk
or perl
would be more preferable to bobsobscuretoolthatneedsinstalling
).
text-processing awk sed perl
add a comment |
up vote
4
down vote
favorite
up vote
4
down vote
favorite
Example Input:
foobar@example.com foo@example.com,bar@example.com
Example Output:
foobar@example.org foo@example.com,bar@example.com
So, in "normal" circumstances, it would obviously be easy to do something like:
sed 's/.com/.org/g'
But obviously in this case, I only want the suffix in the first column to be manipulated, I want the second column to be left untouched.
I don't mind what tool you propose to use. But I prefer it to available on a standard linux without needing further install (i.e. something like sed
or awk
or perl
would be more preferable to bobsobscuretoolthatneedsinstalling
).
text-processing awk sed perl
Example Input:
foobar@example.com foo@example.com,bar@example.com
Example Output:
foobar@example.org foo@example.com,bar@example.com
So, in "normal" circumstances, it would obviously be easy to do something like:
sed 's/.com/.org/g'
But obviously in this case, I only want the suffix in the first column to be manipulated, I want the second column to be left untouched.
I don't mind what tool you propose to use. But I prefer it to available on a standard linux without needing further install (i.e. something like sed
or awk
or perl
would be more preferable to bobsobscuretoolthatneedsinstalling
).
text-processing awk sed perl
text-processing awk sed perl
asked 3 hours ago
Little Code
1927
1927
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
up vote
4
down vote
accepted
$ awk '{ sub(".com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com
This uses awk
to substitute the text matched by .com$
with .org
in the first whitespace-delimited field (only) of each line. The output will be space-delimited.
add a comment |
up vote
4
down vote
You can do it using sed
, just use a regexp that can only match the first word of the line:
sed -r 's/^(S+).com(s+)/1.org2/'
In slo-mo, change:
- a sequence of one or more non-spaces from the beginning (
^(S+)
) .com
- a sequence of one or more non spaces (so that we can only match a final
.com
)
into:
- the first sequence of non-spaces
.org
- the sequence of spaces
Thanks, fixed and improved.
– xenoid
2 hours ago
Not using the/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the finals+
insures that we aren't replacing.com
in the middle of a node id such assome.commonname.com
.
– xenoid
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing.*
and nots+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a.com
. But OK, fair point.
– terdon♦
1 hour ago
Note that the use of PCRE requires GNUsed
.
– Kusalananda
27 mins ago
add a comment |
up vote
3
down vote
If you just want to replace the first occurrence of .com
with .org
, all you need is the default behavior of sed's s///
operator. Just don't use the g
flag:
$ sed 's/.com/.org/' file
foobar@example.org foo@example.com,bar@example.com
If you really want to only make the change on the first comma-defined field, so that if the first .com
appears elsewhere in the line, it will remain unchanged, you can do something like:
$ perl -pe 's/^(S+).com/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, safer in case com
occurs as a substring (e.g. foo.common.net
):
$ perl -pe 's/^(S+).comb/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Alternatively, in GNU sed:
$ sed -E 's/^(S+).comb/1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, portably (assuming the first field is defined by the first space and not a tab or other whitespace):
$ sed -E 's/^([^ ]).com /1.org /' file
foobar@example.org foo@example.com,bar@example.com
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
accepted
$ awk '{ sub(".com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com
This uses awk
to substitute the text matched by .com$
with .org
in the first whitespace-delimited field (only) of each line. The output will be space-delimited.
add a comment |
up vote
4
down vote
accepted
$ awk '{ sub(".com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com
This uses awk
to substitute the text matched by .com$
with .org
in the first whitespace-delimited field (only) of each line. The output will be space-delimited.
add a comment |
up vote
4
down vote
accepted
up vote
4
down vote
accepted
$ awk '{ sub(".com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com
This uses awk
to substitute the text matched by .com$
with .org
in the first whitespace-delimited field (only) of each line. The output will be space-delimited.
$ awk '{ sub(".com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com
This uses awk
to substitute the text matched by .com$
with .org
in the first whitespace-delimited field (only) of each line. The output will be space-delimited.
edited 2 hours ago
answered 3 hours ago
Kusalananda
119k16223365
119k16223365
add a comment |
add a comment |
up vote
4
down vote
You can do it using sed
, just use a regexp that can only match the first word of the line:
sed -r 's/^(S+).com(s+)/1.org2/'
In slo-mo, change:
- a sequence of one or more non-spaces from the beginning (
^(S+)
) .com
- a sequence of one or more non spaces (so that we can only match a final
.com
)
into:
- the first sequence of non-spaces
.org
- the sequence of spaces
Thanks, fixed and improved.
– xenoid
2 hours ago
Not using the/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the finals+
insures that we aren't replacing.com
in the middle of a node id such assome.commonname.com
.
– xenoid
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing.*
and nots+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a.com
. But OK, fair point.
– terdon♦
1 hour ago
Note that the use of PCRE requires GNUsed
.
– Kusalananda
27 mins ago
add a comment |
up vote
4
down vote
You can do it using sed
, just use a regexp that can only match the first word of the line:
sed -r 's/^(S+).com(s+)/1.org2/'
In slo-mo, change:
- a sequence of one or more non-spaces from the beginning (
^(S+)
) .com
- a sequence of one or more non spaces (so that we can only match a final
.com
)
into:
- the first sequence of non-spaces
.org
- the sequence of spaces
Thanks, fixed and improved.
– xenoid
2 hours ago
Not using the/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the finals+
insures that we aren't replacing.com
in the middle of a node id such assome.commonname.com
.
– xenoid
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing.*
and nots+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a.com
. But OK, fair point.
– terdon♦
1 hour ago
Note that the use of PCRE requires GNUsed
.
– Kusalananda
27 mins ago
add a comment |
up vote
4
down vote
up vote
4
down vote
You can do it using sed
, just use a regexp that can only match the first word of the line:
sed -r 's/^(S+).com(s+)/1.org2/'
In slo-mo, change:
- a sequence of one or more non-spaces from the beginning (
^(S+)
) .com
- a sequence of one or more non spaces (so that we can only match a final
.com
)
into:
- the first sequence of non-spaces
.org
- the sequence of spaces
You can do it using sed
, just use a regexp that can only match the first word of the line:
sed -r 's/^(S+).com(s+)/1.org2/'
In slo-mo, change:
- a sequence of one or more non-spaces from the beginning (
^(S+)
) .com
- a sequence of one or more non spaces (so that we can only match a final
.com
)
into:
- the first sequence of non-spaces
.org
- the sequence of spaces
edited 2 hours ago
answered 2 hours ago
xenoid
2,6601724
2,6601724
Thanks, fixed and improved.
– xenoid
2 hours ago
Not using the/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the finals+
insures that we aren't replacing.com
in the middle of a node id such assome.commonname.com
.
– xenoid
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing.*
and nots+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a.com
. But OK, fair point.
– terdon♦
1 hour ago
Note that the use of PCRE requires GNUsed
.
– Kusalananda
27 mins ago
add a comment |
Thanks, fixed and improved.
– xenoid
2 hours ago
Not using the/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the finals+
insures that we aren't replacing.com
in the middle of a node id such assome.commonname.com
.
– xenoid
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing.*
and nots+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a.com
. But OK, fair point.
– terdon♦
1 hour ago
Note that the use of PCRE requires GNUsed
.
– Kusalananda
27 mins ago
Thanks, fixed and improved.
– xenoid
2 hours ago
Thanks, fixed and improved.
– xenoid
2 hours ago
Not using the
/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the final s+
insures that we aren't replacing .com
in the middle of a node id such as some.commonname.com
.– xenoid
1 hour ago
Not using the
/g
doesn't prevent the substitution to occur in other items of the line if it doesn't happen on the first. And capturing the final s+
insures that we aren't replacing .com
in the middle of a node id such as some.commonname.com
.– xenoid
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing
.*
and not s+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a .com
. But OK, fair point.– terdon♦
1 hour ago
Ah! Duh, of course. For some reason I though you were capturing
.*
and not s+
. As for the rest, yes indeed for the general case. Just not for the specific example where the first field contains a .com
. But OK, fair point.– terdon♦
1 hour ago
Note that the use of PCRE requires GNU
sed
.– Kusalananda
27 mins ago
Note that the use of PCRE requires GNU
sed
.– Kusalananda
27 mins ago
add a comment |
up vote
3
down vote
If you just want to replace the first occurrence of .com
with .org
, all you need is the default behavior of sed's s///
operator. Just don't use the g
flag:
$ sed 's/.com/.org/' file
foobar@example.org foo@example.com,bar@example.com
If you really want to only make the change on the first comma-defined field, so that if the first .com
appears elsewhere in the line, it will remain unchanged, you can do something like:
$ perl -pe 's/^(S+).com/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, safer in case com
occurs as a substring (e.g. foo.common.net
):
$ perl -pe 's/^(S+).comb/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Alternatively, in GNU sed:
$ sed -E 's/^(S+).comb/1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, portably (assuming the first field is defined by the first space and not a tab or other whitespace):
$ sed -E 's/^([^ ]).com /1.org /' file
foobar@example.org foo@example.com,bar@example.com
add a comment |
up vote
3
down vote
If you just want to replace the first occurrence of .com
with .org
, all you need is the default behavior of sed's s///
operator. Just don't use the g
flag:
$ sed 's/.com/.org/' file
foobar@example.org foo@example.com,bar@example.com
If you really want to only make the change on the first comma-defined field, so that if the first .com
appears elsewhere in the line, it will remain unchanged, you can do something like:
$ perl -pe 's/^(S+).com/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, safer in case com
occurs as a substring (e.g. foo.common.net
):
$ perl -pe 's/^(S+).comb/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Alternatively, in GNU sed:
$ sed -E 's/^(S+).comb/1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, portably (assuming the first field is defined by the first space and not a tab or other whitespace):
$ sed -E 's/^([^ ]).com /1.org /' file
foobar@example.org foo@example.com,bar@example.com
add a comment |
up vote
3
down vote
up vote
3
down vote
If you just want to replace the first occurrence of .com
with .org
, all you need is the default behavior of sed's s///
operator. Just don't use the g
flag:
$ sed 's/.com/.org/' file
foobar@example.org foo@example.com,bar@example.com
If you really want to only make the change on the first comma-defined field, so that if the first .com
appears elsewhere in the line, it will remain unchanged, you can do something like:
$ perl -pe 's/^(S+).com/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, safer in case com
occurs as a substring (e.g. foo.common.net
):
$ perl -pe 's/^(S+).comb/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Alternatively, in GNU sed:
$ sed -E 's/^(S+).comb/1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, portably (assuming the first field is defined by the first space and not a tab or other whitespace):
$ sed -E 's/^([^ ]).com /1.org /' file
foobar@example.org foo@example.com,bar@example.com
If you just want to replace the first occurrence of .com
with .org
, all you need is the default behavior of sed's s///
operator. Just don't use the g
flag:
$ sed 's/.com/.org/' file
foobar@example.org foo@example.com,bar@example.com
If you really want to only make the change on the first comma-defined field, so that if the first .com
appears elsewhere in the line, it will remain unchanged, you can do something like:
$ perl -pe 's/^(S+).com/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, safer in case com
occurs as a substring (e.g. foo.common.net
):
$ perl -pe 's/^(S+).comb/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Alternatively, in GNU sed:
$ sed -E 's/^(S+).comb/1.org/' file
foobar@example.org foo@example.com,bar@example.com
Or, portably (assuming the first field is defined by the first space and not a tab or other whitespace):
$ sed -E 's/^([^ ]).com /1.org /' file
foobar@example.org foo@example.com,bar@example.com
edited 1 min ago
answered 1 hour ago
terdon♦
127k31245422
127k31245422
add a comment |
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f487293%2fmanipulating-text-in-first-column-only%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