Shell 理解sed命令
如果这个问题太天真,请原谅。我不熟悉shell脚本,无法找到任何好的资源来理解细节。我试图理解一个遗留脚本。请有人告诉我以下命令的作用: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”。
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-
变量,用于替换s3AtlasExtractNamei
- #-
- 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
部分是正则表达式。