0

在我的脚本中,我正在获取一个文本文件并逐行浏览文件并将字符串“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

你能帮我找出我做错了什么吗?

4

3 回答 3

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

于 2013-06-13T09:39:34.870 回答
1

使用 sed 时,应将替换参数用单引号或双引号引起来。

例如,这应该有效:

echo "$LINE" | sed -e "s/test/true/g" > $NEWFILE
于 2013-06-13T09:39:24.807 回答
0

sed 可以通过读取文件并将脚本应用于每一行来工作,这正是您在脚本中所做的。所以你只想:

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

备注:-e这里的参数是可选的,因为你只有一个脚本。

于 2013-06-13T09:40:32.810 回答