I store files named like this: word-word2-word3-word4.txt . The number of "words" varies from file to file.

I want to replace certain of the dashes with pluses e.g word+word2-word3+word4.txt

I want to specify the dashes or minus-signs to change by typing in numbers.

I have an awkward script that doesn't work - it does this:

  • dashes are supplemented with a semi-colon for later awk splitting purposes
  • user types in numbers specifying dashes to replace
  • numbers are appended to end of filename e.g aaa-;bbb-;ccc.txt 1 3
  • and piped into awk for processing
  • in awk, make an array of the appended numbers,
  • and an array of the words with a split on the first field
  • then gsub ';' for '+' on the split array using the number array to specify the index

Here is my grisly script which hardcodes the filename for the purposes of quick fiddling and trialing. I can't think how to exit the awk script usefully. The plan is to exit awk and do a final substitution in sed.

I am quite aware this is a dogs dinner of a script displaying plenty of poor-learning. Nevertheless, please offer any help if you are disposed to.

echo -n "type digits"; 
read nos; varr=$(echo $nos); 
newfile=$(echo $file $varr); 
echo "$newfile" | awk '{ for (i=2; i<=NF ;i++) arr[i]=$i}
                         END{ split($1,spl,"-");
                              for( var in arr ) gsub(";","+", spl[var]); 
                              print THIS IS NOT WORKING - CAN'T GET ANYTHING USEFUL OUT }'

1 Answer 1


I have no idea about awk, however I know the way with shell+sed:

echo -n "type digits : "; 
read nos; 
# this is used to sort numbers in order, otherwise the script
# will work only when user specifies numbers in right order
# also we delete all non-numbers string to make sed code safe enough
nos="$(echo $nos|tr ' ' '\n'|sort -n|grep -v '[^0-9]'|tr '\n' ' ')"
# here we build sed code and modify the text
echo "$file" | { for i in $nos ; do A="s/-/+/$i;$A" ; done ; sed "$A" ; }
  • That works, thx. I don't quite get the last line of your script, in particular the recursive use of $A. Bash loops thru numbers stored in $nos. Each loop writes out a substitution. When the loop finishes, run the final sed which, for two numbers, is a sequence of 2 consecutive sed operations starting with the last one, and ending w the first one...(?)
    – Tom
    Nov 20, 2012 at 15:17
  • Yes, that's right.
    – rush
    Nov 20, 2012 at 18:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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