DavidScott612
DavidScott612

Reputation: 215

difficult string to replace in script using SED

I know, many people have had questions on how to use sed to replace a string, but I have a difficult one here.

I have a file I need to replace a string of text that prompts the user to enter content. I want to automate this so the user does not interact. By replacing this string with a static file path. but the text is a bash script and has ' and " within the string I want to replace. It does not work. Either because I have syntax errors in my formatting, or it simply is not possible to do this action with sed. Please advice!

Here is what I am attempting to do: I want to replace this long string

read -e -p 'Enter path for Boot Partition : '  BOOTUSERFILEPATH

with a string that looks like this:

BOOTUSERFILEPATH=../board-support/prebuilt-images

My attempt:

sed -i "/read -e -p 'Enter path for Boot Partition : '  BOOTUSERFILEPATH/BOOTUSERFILEPATH="../board-support/prebuilt-images"" file_to_search.sh

Update: I fixed the syntax error, but file still is not updated with the new path information... :(

found the problem. the search was not finding the strings because of an extra space in my search command. It works now!

Upvotes: 0

Views: 115

Answers (2)

user4832408
user4832408

Reputation:

There are forward slashes in your string so one needs to use a different delmiter. Here I use '|' as the delimiter.

sed "s|read -e -p \'Enter path for Boot Partition : \'  BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile > newfile

You may note that the -i option to sed which allows files to be edited in place is not a POSIX supported option.

However if you wish to use it:

sed -i "s|read -e -p \'Enter path for Boot Partition : \'  BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile

You may find it easier to use a pattern with sed which matches part of this string and then replaces its entirety:

sed 's|read -e -p .* BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g' filename > newfilename

From the POSIX specification page for sed:

s/BRE/replacement/flags
Substitute the replacement string for instances of the BRE in the pattern space. Any character other than <backslash> or <newline> can be used instead of a slash to delimit the BRE and the replacement.

Upvotes: 2

Jonathan Leffler
Jonathan Leffler

Reputation: 753595

You need to use an actual substitute command, and you need to avoid the slashes in the replacement text from confusing sed. Personally, I'd probably use:

sed -i.bak "s%^read .* BOOTUSERFILEPATH$%BOOTUSERFILEPATH=../board-support/prebuilt-images%" file_to_search.sh

or even more likely:

BOOTUSERFILEPATH="../board-support/prebuild-images"
sed -i.bak "s%^read .* BOOTUSERFILEPATH$%BOOTUSERFILEPATH=$BOOTUSERFILEPATH%" file_to_search.sh

The s%%% uses % instead of / to delimit the parts of the command. I cheated on the match pattern, working on the assumption that you don't have many similar lines in the file.

Upvotes: 1

Related Questions