请原谅,如果这个问题太天真了。我是shell脚本编程新手,无法找到任何理解具体细节的好资源。我试图理解一个遗留脚本。请谁能告诉我下面的命令做什么:理解sed命令
sed "s#s3AtlasExtractName#$i#g" load_xyz.sql >> load_abc.sql;
请原谅,如果这个问题太天真了。我是shell脚本编程新手,无法找到任何理解具体细节的好资源。我试图理解一个遗留脚本。请谁能告诉我下面的命令做什么:理解sed命令
sed "s#s3AtlasExtractName#$i#g" load_xyz.sql >> load_abc.sql;
该命令将替换所有出现的s3AtlasExtractName与$i
是。
i
变量将被用于替换s3AtlasExtractName因此,这将通过load_xyz.sql
解析并将所有发生的s3AtlasExtractName更改为的值并将load_xyz.sql
的全部内容附加到名为load_abc.sql
的文件中,并使用sed替换。
总之,这种读取load_xyz.sql并取代以“s3AtlasExtractName”的每一次出现任何已经存储在shell变量“i”。
长版本是sed接受具有不同格式的许多子命令。任何“简单”的sed命令都会看起来像'sed'。子命令的第一个字母告诉你哪个操作sed要处理你的文件。
“s”操作代表“替代”,是最常用的操作。它后面跟着一个类似Perl的正则表达式:分隔符,正则表达式来查找,分隔符,替换值,分隔符,PREG标志。在你的情况下,分隔符是'#',这是非常不寻常的,但不禁止,因此命令将'$ i'替换为's3AtlasExtractName'的每个实例。 'g'PREG标志告诉sed替换每一次出现的模式(默认是只替换它在输入的每一行中的第一次出现)。
最后,在双引号分隔的字符串中使用“$ i”会告诉shell实际扩展shell变量'i',因此您需要查找shell语句设置(可能是'为'声明)。
希望这会有所帮助。
编辑:我专注于'sed'部分,有点错过了重定向部分。 '>>'令牌告诉shell将sed命令的输出(即load_xyz.sql的内容与所有出现的s3AtlasExtractName替换为$ i的内容)并将其附加到文件'load_abc.sql'。
实际上,'sed'使用的正则表达式不像Perl。 'sed'使用POSIX BREs(请参阅'regex(7)'),而Perl不会。最突出的区别是字符类的符号:例如,对于'sed'中的字母数字字符,您可以使用'[[:alnum:]]',在Perl中使用'\ w'。 – werkritter
此外,#s3AtlasExtractName#$ i#g'不是一个正则表达式 - 它是一个'sed'命令。只有's3AtlasExtractName'部分是一个正则表达式。 – werkritter
sed是命令行流编辑器。你可以在这里找到有关它的信息: http://www.computerhope.com/unix/used.htm
一个简单的例子所示,其中战略经济对话使用在myfile.txt的词“例如”一词取代“测试”,但输出被送到newfile.txt
SED的/测试/示例/ G'的myfile.txt> newfile.txt
似乎脚本通过替换load_xyz.sql文件的内容和将其存储在新的执行类似功能的文件load_abc.sql没有更多的代码我只是猜测,但似乎参数$ i可以用作计数器来插入类似的新值到load_abc.sql文件中。
它正在用'$ i'取代's3AtlasExtractName'值 – anubhava
你确定关于第二组引号吗?该命令**本身**将替换输入文件'load_xyz.sql >> load_abc.sql'(空格,'>>'在文件名中)。所以也许命令文本被传送给shell解释器? – werkritter
非常奇怪:可能有些间隔缺失...'sed“s#...#$ 1”file >> file2':替代并追加到file2。因为它会在名为“load_xyz.sql >> load_abc.sql”的文件中进行替换。“ – JJoao