sed 变量包含 /

sed 变量包含 /

我有一个文本文件,其中包含类似的内容,

some content  
replace content  
other content

我有一些变量,如下所示:

PATH="/path/to/scriptdir"
PARAMETERS="para1 para2"
FILETOCHANGE="/foo/bar"

现在我想替换以以下内容开头的文本文件中的内容代替,变量的内容小路参数。替换后,文本文件应如下所示:

some content
/path/to/scriptdir/script para1 para2
other content

我刚刚尝试了几个 sed 命令,但总是收到错误。例如

sed -i "s/^replace.*$/$PATH/script $PARAMETERS/g" $FILETOCHANGE
sed: -e expression #1, char 12: unknown option to `s'

或者

sed -i "s|^replace.*$|$PATH/script $PARAMETERS|g" $FILETOCHANGE
sed: -e expression #1, char 58: unterminated `s' command

你能告诉我,我做错了什么吗?

答案1

(1) 做不是PATH为此使用变量。它对于 shell 有特殊的意义。我SCRIPTDIR这里选择:

SCRIPTDIR="/path/to/scriptdir"
PARAMETERS="para1 para2"
FILETOCHANGE="/foo/bar"

/(2)在 sed 的替换命令中,您本身不需要斜杠 ( ):s#this#that#或者s|this|that|效果与 一样s/this/that/g。 Sed 仅使用紧跟在 后面的字符s作为其余s(替换)命令的分隔符。您可以使用它来避免模式和替换字符串中的斜杠问题:当您使用 eg|作为分隔符时,斜杠对于 sed 没有任何特殊含义。

所以,这会起作用:

sed "s%^replace.*$%$SCRIPTDIR/script $PARAMETERS%g" $FILETOCHANGE

答案2

最终的解决方案是从 sed 切换到 Perl,后者将变量作为一等公民处理,而不是像 shell 那样作为宏进行扩展。

path=/path/to/scriptdir parameters="para1 para2" perl -i~ -pe \
    's|^replace.*$|$ENV{path}/script $ENV{parameters}|g' -- "$filetochange"
  • -p逐行读取输入并在处理后打印每一行
  • 哈希%ENV包含环境变量,在命令开始时分配给它们使它们导出到命令
  • s///(根据需要更改分隔符)与 sed 类似,请参阅佩洛普

相关内容