![查找并匹配大写字母加冒号(“:”)的单词](https://linux22.com/image/1333257/%E6%9F%A5%E6%89%BE%E5%B9%B6%E5%8C%B9%E9%85%8D%E5%A4%A7%E5%86%99%E5%AD%97%E6%AF%8D%E5%8A%A0%E5%86%92%E5%8F%B7%EF%BC%88%E2%80%9C%3A%E2%80%9D%EF%BC%89%E7%9A%84%E5%8D%95%E8%AF%8D.png)
如何查找和匹配仅以大写字母、冒号(后跟)开头的文本(字母):
并将其替换为单个名称(“MyName”)?
我也想制作彩色文本,但我不知道如何为所有大写字母后跟冒号(:
)添加仅此配色方案,而不修改人名。
例子:
MIKE: - Go to school!
VICTORIA: Yes, I go right now.
到
< font color="#800080">MIKE:</font> - Go to school!
< font color="#800080">VICTORIA:</font> Yes, I go right now.
答案1
PowerShell 解决方案:
Get-Content "file.txt" |
ForEach-Object { $_ -CReplace "[A-Z]+:", "MyName" } |
Set-Content "file.txt"
快速解释:
Get-Content
检索指定文件的内容。管道字符 (|
) 将结果传递给下一个命令。ForEach-Object
逐行循环遍历文件的内容,并对每一行(用 表示$_
)用第二个参数给出的文本替换第一个参数给出的文本。[A-Z]+:
是正则表达式,搜索一个或多个(+
)大写字母([A-Z]
)后跟冒号。-CReplace
用于区分大小写的搜索,因为 PowerShell 中的正则表达式默认不区分大小写。Set-Content
与之相反Get-Content
,将输入写回到给定的文件。
为了便于阅读,我将代码分成几行,但你可以将其全部写在一行中。使用别名你甚至可以大大缩短它:
gc "file.txt" | % { $_ -creplace "[A-Z]+:", "MyName" } | sc "file.txt"
如果您想要实际修改每个匹配,而不是用固定文本替换它,请尝试以下操作:
Get-Content "file.txt" |
ForEach-Object { $_ -CReplace "([A-Z]+:)", '<font color="#800080">$1</font>' } |
Set-Content "file.txt"
请注意与以前版本相比的两个变化:
- 正则表达式
[A-Z]+:
被括号括起来。这将创建一个反向引用,我们稍后在替换文本中将其称为$1
。这就是您在结果中保留要搜索的文本而不是替换它的方法。 - 替换文本周围使用单引号。如果您使用双引号,PowerShell 会尝试将其解释
$1
为不存在的变量,并且不会在您期望名称所在的位置返回任何内容。此外,当文本包含双引号时(如 HTML 的情况),单引号很方便,因为您不必用反引号转义每个双引号。
答案2
您可以使用修改后的 Indreks 答案
-replace "([A-Z]:)", "<font color='#800080'>$1</font>"
或更好
-replace "([A-Z]:)", "<span class='name'>$1</span>"
然后添加到你的 CSS
span.name { color:#800080; }
未经测试,您可能需要使用\
“转义”powershell 中的保留字符。
Powershell 是一个不错的选择,因为您的 Windows 计算机上几乎肯定已经有它了。
我没有动力去学习 Powershell,因为安装 Perl(和/或 GNU 文件实用程序,包括 sed awk grep 等)非常容易
使用 perl 的解决方案如下
perl -p -i -e 's/[A-Z]+:/<span class="name">$&</span>' f1.txt zz.txt b/c/*.txt
(我发现这比 powershell 简单,但我有偏见)