Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

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 want to add $x/ from data formatted as $x-xyz (xyz is a mix of text and number to be ignored).

Example data




How do I describe the variable as text before the hyphen? My idea is:

define $x = # don't know how to do that
## and then somehow use sed to prepend
sed -i s/$/$x/ file
# I don't know if sed can handle variables though - the above one liner is from Googling
share|improve this question
up vote 5 down vote accepted

Here's a quick and dirty awk version:

awk -F- '{print $1"/"$0}' input_file > output_file

What it does is use - as a field separator, and prints the first column (i.e. everything before the first -), then a /, then the whole original line.

A way of doing the same thing with sed would be:

sed -e 's;^\([^-]*\)\(.*\);\1/\1\2;' input_file > output_file

(but that's hardly readable.)

If you want to do it in plain bash, you can use string manipulations:

$ foo=AB-10C
$ prefix=${foo%%-*}
$ echo ${prefix}/${foo}

Use that in a while read loop or similar if the data is coming from a file.

share|improve this answer
Though it was unintentional, I simplified the example a bit, and the results with the real data were interesting. The actual data was like 211,AB-45A,1, and it got manipulated to 211,AB/211,AB-45A,1 with both awk and sed. Couldn't try pure bash since I'm not quite familiar with while read and didn't bother researching. Anyway, I separated the relevant data and it worked as expected - thank you! – Oxwivi Jan 29 '12 at 14:19
For the while loop, just type "[bash] while read" in the search box at the top of this site. You'll get plenty of examples :) – Mat Jan 29 '12 at 14:21

This might work for you:

echo -e "123,AB-10C,4\n567,CD-02E,8" |
sed 's|\([^,]*\)-.*|\1/&|'
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.