Mac终端中sed的语法

时间:2014-05-28 21:46:06

标签: shell sed

我已经获得了别人的shell脚本(bash),其中一行如下:

sed -i "s@_RUNDIR_@$RUNDIRECTORY/runSettings.txt@" start.m

当然,文件中指定了$RUNDIRECTORY,但RUNDIR未在任何地方指定。 runSettings.txt是我有权访问的文件,我认为此处的目标是用$RUNDIRECTORY替换路径的某些部分。通过快速搜索sed -i的语法,我很困惑s@在字符串中的作用。

有人可以用一个非常基本的例子来帮助我吗?

2 个答案:

答案 0 :(得分:1)

-i标志表示它会修改您的文件:通常,sed只会将其结果输出到stdout。您可以将结果通过管道传输到您的文件中,或者使用replace inline标志。

s/[search]/replace]/格式以s开头,这意味着您要进行搜索。您可以使用大多数任何字符代替/,因此在您发布的示例中,使用了@字符:s@[search]@replace@这对于[搜索]或[replace]术语包含/字符,因此您无需进行任何花哨的\/转义。

答案 1 :(得分:0)

RUNDIR不是变量。这是作者希望在start.m中的某些行中出现的文本的一部分。

s表示第一个模式(_RUNDIR_)的任何一行上的第一个匹配项应替换为第二个模式($RUNDIRECTORY/runSettings.txt)的值。

@是一个任意字符,用于描绘模式1和模式2.

在终端中键入man sed以获取更多信息。

如果意图是将文字文​​本$RUNDIRECTORY替换为文件 - 而不是在当前环境中放入可能是该shell变量的值 - 那么您将需要使用单引号而不是双引号:

sed -i 's@_RUNDIR_@$RUNDIRECTORY/runSettings.txt@' start.m