::在sed脚本中做什么

已婚

我想知道它与sed命令一起使用的以下脚本的真正作用。

sed -e 's:<F0_M>:<o,f0,male>:' \
          -e 's:<F0_F>:<o,f0,female>:' \
          -e 's:([0-9])::g' \
          -e 's:<sil>::g' \
          -e 's:([^ ]*)$::' | \

第一个脚本和第二个脚本看起来像我们正在将type文本转换<F0_F><o,f0,female>但是最后三个涉及'::','g' and '$'符号的情况如何呢?在大多数文档中,他们在大多数脚本中都使用了'\'和'/'。但是在这里,他们使用了':'而不是斜杠。有人可以解释以上三个脚本吗?

沃伦·杨(Warren Young)

命令中使用的标准定界符sed/,如下所示:

sed -e s/foo/bar/g < input > output

但是,如果s命令后跟一个不同的字符,则该字符成为该特定表达式的分隔符。

/当分隔符本身需要出现在命令中时,通常会使用非分隔符,因此需要特别注意转义例如,/在处理Unix路径的脚本中使用分隔符很烦人。

在这里似乎不是这种情况,因此我假设该命令的作者只是更喜欢将其:用作命令中的定界符sed

您的命令具有五个表达式:

s:<F0_M>:<o,f0,male>:

这将在输出的<F0_M>每一行中替换输入的每一行的第一个实例<o,f0,male>如果该行上的输入中有多个匹配项,则随后的匹配项将被保留。

单引号只是防止shell解释表达式中的任何字符。它们都按字面意义传递给了sed命令。

s:<F0_F>:<o,f0,female>:

与上述情况类似,仅明显地针对其他性别。

s:([0-9])::g

从输入行中删除括号中的所有一位数字。

与前两个表达式不同,此表达式由于尾随影响了每一行上的所有实例g,这意味着“全局”。

请注意,它仅适用于单个数字。(42)例如,它不会做任何事情

s:<sil>::g

<sil>写入输出时,从输入的每一行中删除所有实例。

s:([^ ]*)$::

如果该字符不包含空格,则在该行的末尾删除带括号的字符。还删除行尾的一对空括号。

有关这些主题的整本书sed以及正则表达式。单个答案确实不是学习整个主题的正确位置。

在这方面,上面的表达式实际上有点棘手:$将正则表达式(或简称为regex)固定到行的末尾和^开头,但该^表达式中的含义有所不同。

我建议您阅读Jeffrey Friedl的Mastering Regular Expressions

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章