system ("grep -E 'Type|group|slack (' $a > temp.rpt");
以上一行给我一个错误Unmatched ( or \(
这里有什么问题?
我在(
之前尝试过反斜杠。它显示了同样的错误。
答案 0 :(得分:6)
由于你在脚本中,为什么不在Perl中这样做?
my $infile = '...';
open my $fh, '<', $infile or die "Can't open $file: $!";
open my $out_fh, '>', $temp.rpt or die "Can't open $temp.rpt: $!";
while (<$fh>) {
print $out_fh $_ if /Type|group|slack \(/;
}
根据需要调整正则表达式。通常,现在更改和调整内容要容易得多。
如果输入文件不是太大,您可以在打开文件后一行处理
print $out_fh grep { /Type|group|slack \(/ } <$fh>;
grep强加<> operator上的列表上下文,因此它会读取并立即返回列表中的所有行,并打印通过该条件的行。
对正则表达式的评论。目前,它与Type
或group
或slack (
匹配。如果您打算匹配任何一个单词,然后是space-paren,则需要分组括号/(?:Type|group|slack) \(/
。 ?:
就在那里,因此不会被不必要地捕获。
答案 1 :(得分:0)
你需要使用三个反斜杠
$msbuild = "C:\pathofexefile\WinSCP.com"
$formatstring="/keygen {0} /output={1}.ppk"
Set-Location "c:\temp"
gci -file -Filter "*.txt" | %{$arguments=($formatstring -f $_.FullName, $_.BaseName);start-process $msbuild $arguments }
答案 2 :(得分:0)
(
是grep -E
中的正则表达式字符。这就是你收到错误的原因。
添加单个反斜杠并不能解决问题,因为perl:"\("
处理的字符串与"("
的字符串相同。
要修复它,您需要使用两个反斜杠("\\("
,它变成两个字符串\(
,然后由grep
解释),或者删除{ {1}}选项,因为-E
在POSIX&#34; basic&#34;中并不特殊。正则表达式(默认情况下(
使用的那个)。