我有数百个输入文件,它们非常相似,但略有不同。我想用另一行文本替换所有打开的文档中的第 4 行。搜索和替换功能不起作用,因为第 4 行在各个文件中的文本不同。
我想要做的一个粗略的例子如下所示:
文件 A 第 4 行:一些文本
文件 B 第 4 行:不同的文本
将第 4 行替换为:新文本
答案1
我想说 Notepad++ 不是完成这项工作的工具。
相反,我建议您使用某种脚本语言来:
- 迭代文件
- 然后迭代这些行
- 替换单行(如果存在)
- 然后保存文件。
下面是可以执行此操作的 PowerShell 脚本:
# Set by user to their needs.
$filesToCheck = "C:\path\to\files\*.txt"
$lineToChange = 4
$replacementLineText = "New Text"
# Gather list of files based on the path (and mask) provided by user.
$files = gci $filesToCheck
# Iterate over each file.
foreach ($file in $files) {
# Load the contents of the current file.
$contents = Get-Content $file
# Iterate over each line in the current file.
for ($i = 0; $i -le ($contents.Length - 1); $i++) {
# Are we on the line that the user wants to replace?
if ($i -eq ($lineToChange - 1)) {
# Replace the line with the Replacement Line Text.
$contents[$i] = $replacementLineText
# Save changed content back to file.
Set-Content $file $contents
}
}
}
答案2
搜索正则表达式:
^(([^\n]*\n){n})[^\n]+
其中“n”是要跳过的行号,并替换为
\1text
其中 text 是您想要在第 n+1 行添加的新文本。
使用适当的 EOL 调整搜索表达式,我使用了适用于 UNIX 的“\n”。
解释:
此脚本查找要跳过的前 n 行:
([^\n]*\n){n}
并将它们保存在缓冲区中(用括号括起来:
(([^\n]*\n){n})
然后是另一行(非空):
([^\n]+)
然后替换为缓冲区的内容
\1
然后是您的新文本。
\1text
附加信息:
如果您想要格外确定,并且文件不是很大,您还可以匹配以下行:
^(([^\n]*\n){n})[^\n]+(\n([^\n]*\n){n})
用。。。来代替
\1text\3
未测试。