gpt4 book ai didi

windows - 如何从文本文件中删除评论

转载 作者:可可西里 更新时间:2023-11-01 09:58:32 24 4
gpt4 key购买 nike

我的文本文件包含一行注释,所有注释都带有“//”。两个正斜杠和一个空格。这些可能会占据整行或只是一行的最后一部分。每条评论都不会超出它所在的行。所以没有/* */跨多行输入注释。

简单来说,所有注释都以“//空格”开头。任何以“//space”开头的内容都应该被删除,该行的尾随空格也应该被删除。前导空格应该保留。应删除任何空行。

示例文件:

// This is a comment
x = 1 // This is also a comment after the double slash
x = 2

x = 3 // The above is a blank line
// Comment on this record but nothing precedes it, so should be deleted.
y = 4 // A line with leading spaces that should be kept.
z = "//path"; // The first double slashes are not a comment since the space is missing after the "//"
// Last comment line.

结果文件(没有尾随空格,但保留前导空格。:

x = 1
x = 2
x = 3
y = 4
z = "//path";

我可以使用 gc file.txt | 删除空行Where-Object { $_ -ne ''} > result.txt。但是,我在阅读“//”注释部分之前的行的开头部分时遇到了问题。

我也试过 findstr 但没有找到如何读取每一行直到“//”然后修剪空格。

我可以编写一个脚本程序来遍历文件并执行此操作,但似乎应该有一种方法可以使用简单的一两行 powershell 或 bat 文件命令来完成它。

在保留文件未注释内容的同时删除这些注释的最简单方法(最短的代码量)是什么?

最佳答案

既然您似乎将“简单”等同于“简短”,那么这里有一个相当简单的解决方案:

gc .\samplefile.txt|%{$_-replace"(.*)(// .*)",'$1'}|?{$_}

如果它对你真的那么重要:-)

更详细一点的版本(仍然使用正则表达式):

Get-Content .\samplefile.txt | Where-Object {
-not ([String]::IsNullOrEmpty($_.Trim()) -or $_-match"^\s*// ")
} |ForEach-Object { $_ -replace "(.*)(// .*)",'$1' }

话虽如此,我(个人)会寻求更详细、更易于阅读/维护的解决方案:

要删除 // 之后的所有内容,最简单的方法是使用 String.IndexOf() 找到第一次出现的 // 并然后使用 String.Substring() 获取第一部分:

PS C:\> $CommentedString = "Content // this is a comment"
PS C:\> $CommentIndex = $CommentedString.IndexOf('// ')
PS C:\> $CommentedString.Substring(0,$CommentIndex)
Content

对于缩进注释,您还可以使用 String.Trim() 删除字符串开头和结尾的空格:

PS C:\> "    // Indented comment" -match '^//'
True

您可以使用 ForEach-Object cmdlet 遍历每一行并应用以上内容:

function Remove-Comments {
param(
[string]$Path,
[string]$OutFile
)

# Read file, remove comments and blank lines
$CleanLines = Get-Content $Path |ForEach-Object {

$Line = $_

# Trim() removes whitespace from both ends of string
$TrimmedLine = $Line.Trim()

# Check if what's left is either nothing or a comment
if([string]::IsNullOrEmpty($TrimmedLine) -or $TrimmedLine -match "^// ") {
# if so, return nothing (inside foreach-object "return" acts like "coninue")
return
}

# See if non-empty line contains comment
$CommentIndex = $Line.IndexOf("// ")

if($CommentIndex -ge 0) {
# if so, remove the comment
$Line = $Line.Substring(0,$CommentIndex)
}

# return $Line to $CleanLines
return $Line
}

if($OutFile -and (Test-Path $OutFile)){
[System.IO.File]::WriteAllLines($OutFile, $CleanLines)
} else {
# No OutFile was specified, write lines to pipeline
Write-Output $CleanLines
}
}

应用于您的样本:

PS C:\> Remove-Comments D:\samplefile.txt
x = 1
x = 2
x = 3

关于windows - 如何从文本文件中删除评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301179/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com