Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I am completely new to regex and I would greatly appreciate any help.

The task is simple. I have a CSV file with records that read like this:


I would like to replace the first comma with a space and leave the rest of the commas intact, for every line. Is there a regex expression that will only match the first comma?

I tried this: ^.....,. This matches the comma, however, it also matches the entire length of the string preceding the comma, so if I try to replace this with a space all of the numbers are deleted as well.

share|improve this question
what tool are you using? (sed, perl, awk, something else?) – Mat Apr 5 '11 at 6:07
Textpad (Windows) – cows_eat_hay Apr 5 '11 at 6:14
up vote 20 down vote accepted

The matching pattern could be:


That means

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

In e.g. perl, the whole match and replace would look like:

s/^([^,]+),/\1 /

The replacement part just takes the whole thing that matched and replaces it with the first block you remembered and appends a space. The coma is "dropped" because it's not in the first capturing group.

share|improve this answer
Awesome! Thank you Mat, it worked great. It actually did not work in Textpad (I think their regex is limited), so I ended up downloading PowerGrep, and used the search and replace with the expression you provided and it worked great. Thanks also for the nice explanation, it helps understand what's going on. – cows_eat_hay Apr 5 '11 at 7:15
s/,/ /

This, by default (i.e. without the g option), replaces only the first match.

share|improve this answer
Is this actually Textpad search&replace syntax? – Daniel Beck Aug 1 '12 at 21:54
This is a syntax of sed, perl and some other tools. – pabouk Dec 2 '13 at 20:57

This should match only the first number and the comma: ^(\d{5}),. If you'd like to gobble up everything else in the line, change the regex to this: ^(\d{5}),(.*)$

share|improve this answer
This also did the trick. I actually ended up using Mat's solution but I tested yours too and it works. Thanks for the help! – cows_eat_hay Apr 5 '11 at 7:18

TextPad always had the ability to use posix notation, but you have to change the settings in a different dialog box. To use TextPad's default settings for regular expressions, you have to "escape" the opening and closing parentheses:

Replace space after 5-digit zip code, at the beginning of each line

^\([0-9]+\)[ ]

With tab


As above, the ^ means start of line

\( is an "escaped parenthesis" and it marks the beginning of the first search expression, i.e., the five digits

[0-9]+ means one or more digits (not just 5-digit zip codes)

\) is another "escaped parenthesis" to mark the end of the first search expression

[ ] is just a space character (you could leave out the brackets, but then no one would be able to see it on this web page :-)

In the replacement expression

\1 is the first search expression, the part between parentheses above (one or more digits)

\t is a tab character

So the search and replace command looks for one or more digits, followed by a space. Then it replaces all that with the same group of digits followed by a tab.

I don't think there is any way simply to find "a space that comes after 5 digits" so you can just replace the space without touching the digits. You have to find the 5 digits (the first string) followed by the space (the second string). Then, although it seems redundant or cumbersome, REPLACE the original string of 5 digits with ITSELF, followed by the tab (the second string).

Everyone who knows this forgets that newbies have no idea about this. That's why I'm spelling it out for you, my friend.

Ed Poor Math Tutor and retired Computer Programmer New York City

share|improve this answer

More elegant solution is to use lazy matching:

s/^(.+?),/\1 /

that will group characters by moving from start of the string (^) towards the end by one character (.+?) on each step untill it finds first comma sign. All this group along with the first comma occurence will be replaces by group (\1) and space character.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.