在 Powershell 中使用第一行重命名文本文件时如何替换重音字符

问题描述 投票:0回答:3

我正在尝试使用每个文件的第一行批量重命名纯文本文件。在您的帮助下,我只想保留字母数字字符,我快到了。唯一的问题是我需要像

é
á
这样的重音字符以它们各自的非重音字符的形式保存:e和a(文本是西班牙语)或按原样保留在名称中,而不是删除。这就是我现在正在使用的:

Get-ChildItem *.txt | Rename-Item -NewName {
    $firstLine = ($_ | Get-Content -TotalCount 1) -replace '[^a-z0-9 ]'
    '{0}.txt' -f $firstLine
}

谢谢。如果可能的话,请告诉我是否有办法保留符号“?”也是。

regex powershell file-rename batch-rename
3个回答
2
投票

方法类似于this answer中使用的方法,您可以在替换正则表达式之前使用

String.Normalize
方法

至于不删除

?
,你可以简单地将其添加到字符范围:
[^a-z0-9 ?]
.

Get-ChildItem *.txt | Rename-Item -NewName {
    $firstLine = ($_ | Get-Content -TotalCount 1 -Encoding utf8).Normalize([Text.NormalizationForm]::FormD) -replace '[^a-z0-9 ?]'
    '{0}.txt' -f $firstLine
}

例子:

$string = 'áÁéÉñÑ?'
$string.Normalize([Text.NormalizationForm]::FormD) -replace '[^a-z0-9 ?]'

# Outputs:
# aAeEnN?

值得注意的是,默认的

Get-Content
编码 在 Windows PowerShell 中会有问题:

Default
使用与系统的活动代码页(通常是 ANSI)相对应的编码。

因此需要

-Encoding utf8
。较新的 PowerShell 版本没有这样的问题,因为它们默认为
utf8NoBOM
.


1
投票

您需要做的就是将

á
é
添加到您的替换排除列表中,它们将被保留:

Get-ChildItem *.txt | Rename-Item -NewName {
    ($_ | Get-Content -TotalCount 1 -Encoding UTF8) -replace '[^a-z0-9éá ]', '' -replace '.*', '$0.txt'
}

至于

?
- 它不是 Windows 中文件名的有效符号,所以我看不出有什么意义。但是你总是可以做多次替换,并用允许的东西替换它。像这样:

"asd we'wea?gke é or á? to b" -replace '[^a-z0-9éá ]', '' -replace '\?', '!!!!'

0
投票

Santiago Squarzon 的有用答案 向您展示了如何将重音字母 - 例如

é
- 转换为它们的 unaccented 形式,例如
e
,使它们被
a-z
正则表达式范围表达式覆盖。

至于保留重音字符原样(你说的也是可以接受的):

代替

a-z
你可以使用
\p{Ll}
,它匹配任何Unicode小写字母因此也匹配重音字母(参见所有Unicode类别列表)。
由于
-replace
不区分大小写大写字母也被隐含地考虑:

Get-ChildItem *.txt | Rename-Item -NewName {
  $firstLine = 
    ($_ | Get-Content -TotalCount 1 -Encoding utf8) -replace '[^\p{Ll}0-9 ]'
  '{0}.txt' -f $firstLine
}

注意:与其他答案一样,我正在使用

-Encoding utf8
来读取您的文件,如果您的文件恰好是 UTF-8 编码但 没有 BOM,则仅在 Windows PowerShell 中才需要这样做。

一个简单的例子:

# -> 'aÄ éE 42'; that is, all letters and digits were preserved.
'a-Ä é/E 42' -replace '[^\p{Ll}0-9 ]'
© www.soinside.com 2019 - 2024. All rights reserved.