我想知道它与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 '$'
符号的情况如何呢?在大多数文档中,他们在大多数脚本中都使用了'\'和'/'。但是在这里,他们使用了':'
而不是斜杠。有人可以解释以上三个脚本吗?
命令中使用的标准定界符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] 删除。
我来说两句