脚本抱怨`sed:选项需要一个参数 - e`和`没有这样的文件或目录`

时间:2013-06-13 09:35:29

标签: bash shell

在我的脚本中,我正在获取一个文本文件并逐行浏览文件并将字符串“test”替换为“true”,然后将其重定向到新文件。这是我的代码:

cat $FILENAME | while read LINE
do
echo  "$LINE" | sed -e `s/test/true/g` > $NEWFILE
done

然而,当我执行脚本时,我收到以下错误:

/home/deploy/KScript/scripts/Stack.sh: line 46: s/test/true/g: No such file or directory
sed: option requires an argument -- e
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

  -n, --quiet, --silent

                 suppress automatic printing of pattern space

  -e script, --expression=script

                 add the script to the commands to be executed
  -f script-file, --file=script-file

                 add the contents of script-file to the commands to be executed

  -i[SUFFIX], --in-place[=SUFFIX]

                 edit files in place (makes backup if extension supplied)
  -c, --copy
                 use copy instead of rename when shuffling files in -i mode
         (avoids change of input file ownership)

  -l N, --line-length=N

                 specify the desired line-wrap length for the `l' command
  --posix
                 disable all GNU extensions.

  -r, --regexp-extended

                 use extended regular expressions in the script.

  -s, --separate

                 consider files as separate rather than as a single continuous
                 long stream.

  -u, --unbuffered

                 load minimal amounts of data from the input files and flush
                 the output buffers more often
      --help     display this help and exit
      --version  output version information and exit

你能帮我找一下我做错的事吗?

3 个答案:

答案 0 :(得分:2)

对于这样的错误,请将set -x放在echo "$LINE" | sed -e 's/test/true/g' > $NEWFILE

之前的行中
set +x
echo  "$LINE" | sed -e `s/test/true/g` > $NEWFILE

然后Bash会在执行它之前打印命令行,引用参数。这应该可以让你知道它失败的原因。

确保使用正确的引号字符。 `(反引号)和'(单引号)是不同的东西。第一个将尝试执行命令s/test/true/g并将此命令的结果传递给sed

答案 1 :(得分:1)

使用sed时,您应该用单引号或双引号引用替换参数。

例如,这应该有效:

echo "$LINE" | sed -e "s/test/true/g" > $NEWFILE

答案 2 :(得分:0)

sed可以通过读取文件并将脚本应用到每一行来工作,这非常像你在脚本中所做的那样。所以你只想:

sed -e 's/test/true/g' "$FILENAME" > "$NEWFILE"

备注:此处-e参数是可选的,因为您只有一个脚本。