需要了解sed命令中“/”的使用

需要了解sed命令中“/”的使用

我想了解 sed 命令

例如我有命令:

rtNum=`pwd | sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'`

rtRun=`pwd | sed -e 's/^.*bbsp.\/rt.*\///'`

其中 pwd 是:/tfsrun/bbsp2/rt3/run 它产生的输出为:

echo $rtNum 
3

echo $rtRun 
run

-e我想了解上面的sed命令,尤其是上面sed命令中/、//和///的使用和使用。

答案1

正如手册所述,该-e选项表明接下来有一个脚本。您的脚本正在使用正则表达式将匹配的内容替换为空字符串。

要理解正则表达式,我建议花足够的时间阅读例如https://www.tutorialspoint.com/unix/unix-regular-expressions.htm

对于您的问题: \/是转义斜杠,这意味着它们不会被视为分隔符。 /是将匹配字符串与目标字符串分开的分隔符

例如's/matchingstring/targetstring/'s 调用用目标字符串替换第一次出现的匹配字符串。

在你的情况下:

  • '//'表示目标字符串为空,因为分隔符之间没有任何内容
  • '///'实际上是,'\///'这意味着匹配字符串以斜杠结尾并且目标字符串为空。

答案2

-eto 标志是sed“执行/运行这个”的一种表达方式。如果您想sed在同一sed调用中运行多个编辑命令(除非您用 分隔它们;),则需要它。

例如,仅从文件中提取/打印第 1 行和第 20 行到第 30 行(该-n标志关闭每个输入行的默认输出):

$ sed -n -e '1p' -e '20,30p'

在 中,使用sed单个正斜杠 ( ) 来分隔正则表达式。/

例如,删除同一行中包含字符串“hello”后跟“word”的所有行:

$ sed '/hello.*world/d'

有时您可能会在替换中看到双正斜杠。命令执行ssed字符串替换与正则表达式匹配的内容:

s/pattern/replacement/

如果意图是删除与模式匹配的东西,替换将为空,我们最终会得到

s/pattern//

三重正斜杠 ( ///) 来自某人试图删除模式以斜杠结尾。由于斜杠用作分隔符,您还会注意到第一个斜杠是逃脱了用反斜杠( \/)组成\///。 “转义”意味着“被视为文字字符,而不是分隔符”。

在进行替换时,还有其他几种方法可以解决尴尬的斜线问题sed。采取替代

s/\///

/这会删除每行的第一个(实际上替换为空)。

另一种方法是写

s/[/]//

这会将斜杠放入字符组中,或者括号表达式。始终将此类组中的所有字符视为文字字符sed。括号表达式仅匹配字符超出其中列出的字符。

另一种方法是使用另一个分隔符:

s#/##

在这里,#字符充当分隔符的角色(可以选择任何字符)。要#在用作分隔符时匹配 a #,必须使用\#或之一[#],就像使用默认/分隔符时必须执行的操作一样。

所以,查看sed命令行

sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'

这将执行两个编辑操作:

  1. s/^.*bbsp.\/rt// 或者 s#^.*bbsp./rt##
  2. s/\/.*$// 或者 s#/.*$##

两者都是替换(s中的编辑命令sed),并且都将其匹配的模式替换为空,即它们都从输入中删除了某些内容。

第一个模式^.*bbsp.\/rt将从行的开头 ( ^) 开始匹配,任意数量的任意字符 ( .*),后跟字符串bbsp,后跟一些其他字符 ( .) 和字符串/rt

所以看起来它会删除该行中直到并包括/rtafter 的所有内容bbsp.,其中.代表任何字符。

第二个模式 ,\/.*$将匹配 a 之后/到行尾 ( $) 的任何内容。

所以给定文本行

/tfsrun/bbsp2/rt3/run

第一次替换会将其变成

3/run

第二个会把它变成

3

答案3

这里是你的引述man sed

-e 脚本,--表达式=脚本

  add the script to the commands to be executed

s/正则表达式/替换/

  Attempt to match regexp against the pattern space.  If successful, replace  
  that  portion  matched  with  replacement.  The replacement may contain the
  special character & to refer to that portion of the pattern space which
  matched, and the special escapes \1 through \9 to refer to the corresponding
  matching sub-expressions in the regexp.

相关内容