考虑一下我的简陋hello.html
文件,它是用强大的编辑器编辑的:
$ ed hello.html
28
,p
<title>Hello world!</title>
在标题HTML 标签内进行编辑的一般方法是什么(如果您可以在任何 HTML 标签内进行编辑,那就更好了)?
我尝试了在标签内匹配的正则表达式:
s/>.*/>My new title/p
<title>My new title
u
.
<title>Hello world!</title>
</title>
但是,可悲的是,您可以看到我砍掉了我的标签(每次都输入该位的工作量太大了!)。
为了进一步学习,我浏览了 Pascal 中的软件工具页面到 174 — 请参阅https://archive.org/details/softwaretoolsinp00kern/page/174/mode/1up?view=theater页面 — 并发现了&
有助于到达句子中间:
s/world/& again/p
<title>Hello world again!</title>
但是,这不太正确,因为我想替换中间,而不仅仅是到达中间。
您可以使用
[^<]
代替来.
匹配除代替之外的任何字符<
。<
另一种方法可能是在每个或之后插入换行符,>
以便您想要更改的内容在其自己的行上,您可以c
使用以下命令进行更改c
:更好的方法是使用 HTML 感知解析器并使用它来编辑内容。我更喜欢的工具是
xmlstarlet
因为虽然它是一个 XML 解析器/编辑器,但它也可以处理 HTML:创建示例页面
Hello world!
用。。。来代替Hello everyone!
:输出写入stdout,这里通常的方法是将其写入临时文件,然后替换原始文件。这并不完美,但可能是可以接受的:
请注意,如果以以下方式
$file
开头,-
您将收到错误xmlstarlet
,并且您无法使用--
它将其与真实选项分开。我们在这里所做的是检查文件名是否是绝对的,如果不是,则在前面添加./
.cp
如果不需要保存原始内容的副本,可以省略该行。您不应该使用正则表达式来解析 HTML。请参阅https://stackoverflow.com/questions/1732348/regex-match-open-tags- except-xhtml-self-contained-tags
如果您想使用
ed
下面的代码来执行此操作,请为您提供的 HTML 标记执行此操作。但使用可能会更好sed
。这是有效的,因为您可以将任何字符与 一起使用s
,不必是s/old/new/
它可以是s|old|new|
ors!old!new!
。来自https://www.gnu.org/software/sed/manual/html_node/The-_0022s_0022-Command.html