Shell 理解sed命令

Shell 理解sed命令,shell,sed,Shell,Sed,如果这个问题太天真,请原谅。我不熟悉shell脚本,无法找到任何好的资源来理解细节。我试图理解一个遗留脚本。请有人告诉我以下命令的作用: sed "s#s3AtlasExtractName#$i#g" load_xyz.sql >> load_abc.sql; 简而言之,它读取load_xyz.sql并用shell变量“i”中存储的任何内容替换“s3AtlasExtractName”的每次出现 长版本是sed接受许多具有不同格式的子命令。任何“简单”sed命令看起来都像“sed”。

如果这个问题太天真,请原谅。我不熟悉shell脚本,无法找到任何好的资源来理解细节。我试图理解一个遗留脚本。请有人告诉我以下命令的作用:

sed "s#s3AtlasExtractName#$i#g" load_xyz.sql >> load_abc.sql;

简而言之,它读取load_xyz.sql并用shell变量“i”中存储的任何内容替换“s3AtlasExtractName”的每次出现

长版本是sed接受许多具有不同格式的子命令。任何“简单”sed命令看起来都像“sed”。子命令的第一个字母告诉您sed将对您的文件执行哪个操作

“s”操作代表“替换”,是最常用的。它后面是一个类似Perl的regexp:separator、要查找的regexp、separator、要替换的值、separator、PREG标志。在您的例子中,分隔符是“#”,这很不寻常,但不是禁止的,因此命令将“$i”替换为“s3AtlasExtractName”的每个实例。“g”PREG标志告诉sed替换模式的每个匹配项(默认情况下,只替换输入中每行上的第一个匹配项)

最后,在双引号分隔的字符串中使用“$i”告诉shell实际展开shell变量“i”,因此您需要查找一个shell语句设置(可能是一个“for”语句)

希望这有帮助


编辑:我专注于“sed”部分,但有点错过了重定向部分。“>>”标记告诉shell获取sed命令的输出(即,load_xyz.sql的内容,所有出现的s3AtlasExtractName都替换为$i的内容),并将其附加到文件“load_abc.sql”中。

此命令将用
$i
替换所有出现的s3AtlasExtractName

  • s-
  • #-
  • s3AtlasExtractName-需要替换的单词
  • #-
  • $i-
    i
    变量,用于替换s3AtlasExtractName
  • #-
  • g-在一行中替换s3AtlasExtractName的所有实例,而不仅仅是它的第一个实例

因此,这将通过
load_xyz.sql
进行解析,将所有出现的s3AtlasExtractName更改为
$i
的值,并将
load_xyz.sql
的全部内容附加到名为
load_abc.sql
的文件中,并使用sed替换。

sed是一个命令行流编辑器。您可以在此处找到相关信息:

下面显示了一个简单的示例,其中sed用于将myfile.txt中的单词“test”替换为单词“example”,但输出被发送到newfile.txt

sed's/test/example/g'myfile.txt>newfile.txt


您的脚本似乎正在执行类似的功能,即替换load_xyz.sql文件的内容并将其存储在新文件load_abc.sql中,无需更多代码。我只是猜测,但参数$I似乎可以用作计数器,将类似但新的值插入load_abc.sql文件。

它正在替换
s3AtlasExtractName
by
$i
value您确定第二组引号吗?此命令本身将替换输入文件
load_xyz.sql>>load_abc.sql
(文件名中的空格和
>
)。那么可能命令文本通过管道传输到shell解释器?非常奇怪:可能缺少一些间隔符<代码>sed“s#…#$1”文件>>文件2:替换并附加到文件2。它将在名为“
load_xyz.sql>>load_abc.sql
”的文件中进行替换@werkritter:这是一个打字错误。谢谢你的指点!谢谢你提供的所有细节。真的很有帮助!没问题。实际上,
sed
使用的正则表达式与Perl不同
sed
使用POSIX BRE(参见
regex(7)
),而Perl不使用。最显著的区别是字符类的表示法:例如,对于
sed
中的字母数字字符,您将使用
[:alnum:]
,而在Perl中,
\w
。此外,
s\s3AtlasExtractName.$i\g
不是正则表达式-它是
sed
命令。只有
s3AtlasExtractName
部分是正则表达式。