Shell: Find and replace word

10,607

Solution 1

This will solve your 1st issue:

echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A\\&A"); print }'

(& is a special char in awk substitution: it means "what has been matched". You need to escape if with a \. And as you are in a awk string, your need to put 2 \ to produce one as \ escape the next char as in \n.)

This will solve your 2nd issue:

ProjectName=toto
echo "[STATUS REPORT] PROJECT" |  awk -v "ProjectName=$ProjectName" '{ gsub(/PROJECT/, ProjectName); print }'

(Edit: notice the newly added " around ProjectName=$ProjectName so a space in ProjectName does not break the script.)

But awk is a big tool to perform string substitution, you might want to use sed:

echo "[STATUS REPORT] PROJECT" |  sed -e 's/PROJECT/A\&A/'
ProjectName=toto;
echo "[STATUS REPORT] PROJECT" |  sed -e "s/PROJECT/${ProjectName//\//\\/}/"

(Edit: a / in ProjectName will was breaking the initial solution. I added the escaping of slashes, but some other char(s) still breaks it: &, \1, ... I think plain bash shell bellow is safer.)

or in plain bash shell:

msg="[STATUS REPORT] PROJECT"
echo ${msg//PROJECT/A&A}
ProjectName=toto
echo ${msg//PROJECT/$ProjectName}

Solution 2

(Sorry, I don't have commenting privileges here)

From the snippet you've posted it's not very clear why you need to pipe the string to awk.

You can simply use the variable within the echo statement and bash will replace the variable:

echo "[STATUS REPORT] $ProjectName"
Share:
10,607

Related videos on Youtube

smokinguns
Author by

smokinguns

Updated on September 18, 2022

Comments

  • smokinguns
    smokinguns over 1 year

    I have a string in my shell script which is in a fixed format : '[STATUS REPORT] PROJECT'. When user executes my shell script he will be asked to provide a value for 'PROJECT'.

    I would like to replace the word 'PROJECT' with the user provide value. For Eg if 'ABCD' was user input:

    '[STATUS REPORT] ABCD'

    I have two issues: 1: How to tackle special characters like '&' in a project name? For eg:

    echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, "A&A"); print }' 
    

    and I get the following output:

    [STATUS REPORT] APROJECTA

    2: My actual shell statement looks like this:

    echo "[STATUS REPORT] PROJECT" |  awk '{ gsub(/PROJECT/, $ProjectName); print }'
    

    where $ProjectName stores the project name provided by user. But this doesn't seem to work

    How can I get this working properly?

  • smokinguns
    smokinguns almost 13 years
    This shell script is part of a GUI App. The "[STATUS REPORT] PROJECT" line will be a user preference. A user can set this line to "PROJECT [STATUS REPORT]" as his preference. I dont want to hard code this. Hence I'm looking to replace this programmatically
  • Alpha Romeo
    Alpha Romeo almost 13 years
    OK, I See. It looks like jfgagne's awk based solution may work better for you. Since ProjectName is declared as an awk variable, you shouldn't have any problems with special characters.
  • glenn jackman
    glenn jackman almost 13 years
    To be pedantic, this is not true: "& is a special char in regular expressions" -- & is special in the replacement string of the sub and gsub commands.
  • jfg956
    jfg956 almost 13 years
    @glenn: true, I updated the answer.