我想了解 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
-e
to 标志是sed
“执行/运行这个”的一种表达方式。如果您想sed
在同一sed
调用中运行多个编辑命令(除非您用 分隔它们;
),则需要它。
例如,仅从文件中提取/打印第 1 行和第 20 行到第 30 行(该-n
标志关闭每个输入行的默认输出):
$ sed -n -e '1p' -e '20,30p'
在 中,使用sed
单个正斜杠 ( ) 来分隔正则表达式。/
例如,删除同一行中包含字符串“hello”后跟“word”的所有行:
$ sed '/hello.*world/d'
有时您可能会在替换中看到双正斜杠。命令执行s
用sed
字符串替换与正则表达式匹配的内容:
s/pattern/replacement/
如果意图是删除与模式匹配的东西,替换将为空,我们最终会得到
s/pattern//
三重正斜杠 ( ///
) 来自某人试图删除模式以斜杠结尾。由于斜杠用作分隔符,您还会注意到第一个斜杠是逃脱了用反斜杠( \/
)组成\///
。 “转义”意味着“被视为文字字符,而不是分隔符”。
在进行替换时,还有其他几种方法可以解决尴尬的斜线问题sed
。采取替代
s/\///
/
这会删除每行的第一个(实际上替换为空)。
另一种方法是写
s/[/]//
这会将斜杠放入字符组中,或者括号表达式。始终将此类组中的所有字符视为文字字符sed
。括号表达式仅匹配一字符超出其中列出的字符。
另一种方法是使用另一个分隔符:
s#/##
在这里,#
字符充当分隔符的角色(可以选择任何字符)。要#
在用作分隔符时匹配 a #
,必须使用\#
或之一[#]
,就像使用默认/
分隔符时必须执行的操作一样。
所以,查看sed
命令行
sed -e 's/^.*bbsp.\/rt//' -e 's/\/.*$//'
这将执行两个编辑操作:
s/^.*bbsp.\/rt//
或者s#^.*bbsp./rt##
s/\/.*$//
或者s#/.*$##
两者都是替换(s
中的编辑命令sed
),并且都将其匹配的模式替换为空,即它们都从输入中删除了某些内容。
第一个模式^.*bbsp.\/rt
将从行的开头 ( ^
) 开始匹配,任意数量的任意字符 ( .*
),后跟字符串bbsp
,后跟一些其他字符 ( .
) 和字符串/rt
。
所以看起来它会删除该行中直到并包括/rt
after 的所有内容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.