2015-07-21 143 views
1

请原谅,如果这个问题太天真了。我是shell脚本编程新手,无法找到任何理解具体细节的好资源。我试图理解一个遗留脚本。请谁能告诉我下面的命令做什么:理解sed命令

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

它正在用'$ i'取代's3AtlasExtractName'值 – anubhava

+1

你确定关于第二组引号吗?该命令**本身**将替换输入文件'load_xyz.sql >> load_abc.sql'(空格,'>>'在文件名中)。所以也许命令文本被传送给shell解释器? – werkritter

+0

非常奇怪:可能有些间隔缺失...'sed“s#...#$ 1”file >> file2':替代并追加到file2。因为它会在名为“load_xyz.sql >> load_abc.sql”的文件中进行替换。“ – JJoao

回答

4

该命令将替换所有出现的s3AtlasExtractName$i是。

  • 小号 - Substitute
  • - Delimiter
  • s3AtlasExtractName - 字,需要代
  • - Delimiter
  • $ I - i变量将被用于替换s3AtlasExtractName
  • - Delimiter
  • - Global在一个单一的线路替换s3AtlasExtractName的所有实例,而不仅仅是它的第一次出现

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

+1

感谢您的所有细节。真是有帮助! – nish

+0

没问题。 <3 sed:P – Songy

-1

总之,这种读取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'。

+0

实际上,'sed'使用的正则表达式不像Perl。 'sed'使用POSIX BREs(请参阅'regex(7)'),而Perl不会。最突出的区别是字符类的符号:例如,对于'sed'中的字母数字字符,您可以使用'[[:alnum:]]',在Perl中使用'\ w'。 – werkritter

+0

此外,#s3AtlasExtractName#$ i#g'不是一个正则表达式 - 它是一个'sed'命令。只有's3AtlasExtractName'部分是一个正则表达式。 – werkritter

0

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文件中。