Bas van Dijk
Bas van Dijk

Reputation: 10703

Sed gives: sed: can't read : No such file or directory

I have the following bash script which repeats for each image found. It needs to iterated over all html, css and js files, and replace all occurrences of an image within that file.

 for image in app/www/images-theme-dark/*.png
    do
        echo "installing icon" $image

        # extract filename from iconpath
        iconfile=$(basename $image)
        iconPath="images/"$(basename $image)

        # replace paths in all files containing icon paths
        find app/www -type f \( -name "*.html" -or -name "*.css" -or -name "*.js" \
                            -or -name "*.appcache" \)  \
            -exec sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}" \;

    done

However when I run the script sed gives:

sed: can't read : No such file or directory

On StackOverflow I've found sed: can't read : No such file or directory But I already had quotes around {}

When I echo the sed command and and execute it on the command line manually there is no error.

I am using GNU sed v4.2.2 on Raspbian GNU/Linux 8.0 (jessie)

Does someone see what could be wrong here?

Upvotes: 90

Views: 155659

Answers (5)

PHZ.fi-Pharazon
PHZ.fi-Pharazon

Reputation: 2073

In my case, I was using Ubuntu on Vagrant/Virtualbox, and I had to add

sleep 5

before the sed -command. It seems that the previous command had not flushed the disk fast enough, and was giving the errors when run fast in a script.

The other symptom was that if you ran the same command manually, it worked just fine.

Upvotes: 0

Vishnu
Vishnu

Reputation: 4263

For me, it got fixed by restarting

wsl --shutdown

Upvotes: -7

storenth
storenth

Reputation: 1225

In my bash scripts I use something like that (to support both MacOS and Linux distributions):

SEDOPTION=
if [[ "$OSTYPE" == "darwin"* ]]; then
  SEDOPTION="-i ''"
fi

sed $SEDOPTION "/^*/d" ./file

Upvotes: 11

Ari Seyhun
Ari Seyhun

Reputation: 12511

For support on both OSX and Linux, I use a simple if check to see if the bash script is running on OSX or Linux, and adjust the command's -i argument based on that.

if [[ "$OSTYPE" == "darwin"* ]]; then
  sed -i '' -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
else
  sed -i -e 's|$iconPath|images-theme-dark/$iconfile|g' "{}"
fi

Upvotes: 109

Yunnosch
Yunnosch

Reputation: 26703

(Compiling an answer from comments, the know-how is by melpomene and AlexP.)

What is that '' after sed -i?

-i means in-place, that is, edit in the file directly.
-i '' means edit in place a file whose name is the empty string.
Since there probably is no file whose name is the empty string, sed complains that it cannot read it.

Note 1 platform dependency:
The syntax of -i is one difference between GNU sed and sed from mac os.

Note 2 "usual" order of arguments:
The -e switch to indicate the sed code allows having it in between file names.
This is a trap (in which I for example got caught embarassingly), by making you trip over your expectations of what you find where in an sed command line.
It allows
sed -i filename -e "expression" AnotherFileName
which is an unintentionally camouflaged version of
sed -i'NoExtensionGiven' "expression" filename AnotherFileName.

Upvotes: 128

Related Questions