我发现了一个非常棒的教程解释一些实际sed
例子。
最后一个(编号 10)如下所示:
$ sed -e 's/<[^>]*>//g'
This <b> is </b> an <i>example</i>.
This is an example.
有人可以帮我解决这个问题吗?
总结一下我的处境: 1.我理解 :s/x/y/g
是一个命令,告诉 sed “用正则表达式全局替换正x
则表达式y
2. 看起来该-e
标志将 sed 置于某种“交互模式”,从页面man
:
-e command
Append the editing commands specified by the command argument to
the list of commands.
这对我来说似乎很困惑,因为我们似乎没有给出sed
一个“命令列表”,而似乎我们给出了一个“参数列表”,所以我不确定这一点。 3.我知道第一个也是唯一一个<
只不过是单个字符正则表达式<
,最后一个>
也只不过是单个字符正则表达式>
4.我知道 sed*
告诉 sed 匹配它之前的模式的 0 次或多次出现,在这种情况下,它位于括号内;然而,这就是我真正困惑的地方:有人可以[^>]*
为我打开更多东西吗?
所以我真正困惑的是:
- 用简单的英语来说是怎么回事
-e
? - 这是怎么回事
[^>]*
?
谢谢 :)
答案1
该序列s/<[^>]*>//g
是一个命令到sed
处理引擎;它告诉它执行“搜索和替换”。因此-e 's/..../g'
意味着“将此搜索和替换命令添加到sed
.
如果我们在一个命令中执行多个命令,这可能更有意义:
sed -e '1d' -e '$d'
将在sed
处理中添加两个命令; “删除第一行”和“删除最后一行”。
是[^>]
一个正则表达式,意思是“除了>
所以[^>]*
意味着“零个或多个任何字符,除了>
so<[^>]*>
表示 a <
,可选地后跟 non- >
,后跟>
。
然后我们将其放入“搜索和替换”命令中,其中该序列不被任何内容替换,并且然后在一行中重复多次(最后一次g
)。
这意味着该字符串hello <abc> there <def>
将首先匹配<abc>
(<
,然后abc
匹配“零个或多个非>
”,然后是>
)并将其替换为空,然后对 重做此操作<def>
。结果将是hello there
。
(请注意多余的空格,因为我们不会删除它们!)
答案2
将范围限制为两点:
告诉
-e
您sed
后面有一个编辑命令是
[^>]*
一个匹配零个或多个字符的模式,这些字符可以是除>
特点
编辑命令说
's/<[^>]*>//g'
更改任何匹配的内容<
,后跟任意数量的字符,直到第一个>
到没有什么。并且只要有匹配就重复多次。