Skip to content
Cassidy Marble edited this page Jun 16, 2024 · 15 revisions

See if you can use ${variable//search/replace} instead.

Problematic code:

string="stirng" ; echo "$string" | sed -e "s/ir/ri/"

Correct code:

string="stirng" ; echo "${string//ir/ri}"

Here is a demonstration of the different search/replace available in Bash:

var="foo foo"
# the following two echo's should be equivalent:
echo "$var" | sed 's/^foo/bar/g'
echo ${var/#foo/bar}
$var sed expression bash equivalent result
foo foo s/foo/bar/ ${var/foo/bar} bar foo
foo foo s/foo/bar/g ${var//foo/bar} bar bar
foo foo s/^foo/bar/ ${var/#foo/bar} bar foo
-foo foo s/^foo/bar/ ${var/#foo/bar} -foo foo
-foo foo s/foo$/bar/ ${var/%foo/bar} -foo bar
-foo foo- s/foo$/bar/ ${var/%foo/bar} -foo foo-

Rationale:

Let's assume somewhere earlier in your code, you have put data into a variable (Ex: $string). Now you want to search and replace inside the contents of $string and echo the contents out. You could pass this to sed as done in the example above, but for simple substitutions, a parameter expansion can do it with less overhead.

Exceptions

Occasionally a more complex sed substitution is required. For example, getting the last character of a string.

string="stirng" ; echo "$string" | sed -e "s/^.*\(.\)$/\1/"

This is a bit simple for the example, and there are alternative ways of doing this in the shell, but this SC2001 flags on several of my crazy complex sed commands beyond this example's scope. Utilizing some of the more complex capabilities of sed is required occasionally, and it is safe to ignore SC2001.

Related resources:

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally