我有一个文本文件,其中包含类似的内容,
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 类似,请参阅佩洛普