我有一个程序将文本输出写入STDOUT。我想过滤和着色这些输出。在PowerShell中,我编写了一个CmdLet,它解析文本行并将它们发送到控制台,并根据需要为某些部分着色。 Example
在PowerShell中,我有这样一个功能:
function Write-ColoredProgLine
{ [CmdletBinding()]
param(
[Parameter(ValueFromPipeline=$true)]
$InputObject,
[Parameter(Position=1)]
[switch]$SuppressWarnings = $false,
[Parameter(Position=2)]
[string]$Indent = ""
)
begin
{ $ErrorRecordFound = $false }
process
{ if (-not $InputObject)
{ Write-Host "Empty pipeline!" }
elseif ($InputObject -is [string])
{ if ($InputObject.StartsWith("vlib "))
{ Write-Host "${Indent}$InputObject" -ForegroundColor Gray } }
elseif ($InputObject.StartsWith("** Warning:") -and -not $SuppressWarnings)
{ Write-Host "${Indent}WARNING: " -NoNewline -ForegroundColor Yellow
Write-Host $InputObject.Substring(12)
}
elseif ($InputObject.StartsWith("** Error:") -and -not $SuppressWarnings)
{ $ErrorRecordFound += 1
Write-Host "${Indent}WARNING: " -NoNewline -ForegroundColor Yellow
Write-Host $InputObject.Substring(12)
}
}
else
{ Write-Host "Unsupported object in pipeline stream" }
}
end
{ $ErrorRecordFound }
}
用法:
$expr = "prog.exe -flag -param foo"
$errors = Invoke-Expression $expr | Write-ColoredProgLine $false " "
如何在Bash中处理此类操作?
我在过滤器脚本中需要某种内部状态,因此像GRC这样的工具不够强大。
答案 0 :(得分:2)
以下是与POSIX兼容的方法:
awk '
/vlib/ {
$0 = "\33[1;36m" $0 "\33[m"
}
/warning/ {
$0 = "\33[1;33m" $0 "\33[m"
}
1
'
结果:
应该注意,您无法使用POSIX Sed。虽然它是 诱人的,POSIX Sed没有办法在这里创建所需的转义序列 POSIX Awk确实如此。
答案 1 :(得分:0)
您可以在管道中使用sed
。也许它不是最简单的工具,但非常强大。你可以用替换命令做很多事情:
echo test | sed -e 's/es/ES/'
输出:
tESt
这也可以用于通过替换来删除一些模式:
sed -e 's/pattern//'
并为您的模式添加前缀/后缀(&是您的匹配):
sed -e 's/pattern/PREFIX&SUFFIX/'
对于着色语法,请检查以下链接: http://ascii-table.com/ansi-escape-sequences.php
但是如果你需要保持一些内在状态,那么使用awk