我在文件中有以下字符串,并希望将字符串截断为不超过6个字符。如何在perl中使用正则表达式? 原始文件是:
cat shortstring.in:
<value>1234@google.com</value>
<value>1235@google.com</value>
我想把文件作为:
cat shortstring.out
<value>1234@g</value>
<value>1235@g</value>
我有一个如下代码,有没有比使用更有效的方法
s/<value>(\w\w\w\w\w\w)(.*)/$1/;
?
以下是我的代码的一部分:
while (<$input_handle>) { # take one input line at a time
chomp;
if (/(\d+@google.com)/) {
s/(<value>\w\w\w\w\w\w)(.*)</value>/$1/;
print $output_handle "$_\n";
} else {
print $output_handle "$_\n";
}
}
答案 0 :(得分:10)
使用它(正则表达式不是Perl的唯一功能,它对此有点过分了:: - )
$str = substr($str, 0, 6);
答案 1 :(得分:5)
$ perl -pe 's/(<value>[^<]{1,6})[^<]*/$1/' shortstring.in <value>1234@g</value> <value>1235@g</value>
在您问题的代码段中,使用
while (<$input_handle>) {
s!(<value>)(.*?)(</value>)!$1 . substr($2,0,6) . $3!e
if /(\d+\@google\.com)/;
print $output_handle $_;
}
或使用单一模式
while (<$input_handle>) {
s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e;
print $output_handle $_;
}
使用bang作为替换运算符的分隔符会阻止</value>
中的Leaning Toothpick Syndrome。
注意:通常warnings关于使用正则表达式解析“XML”。
演示程序:
#! /usr/bin/perl
use warnings;
use strict;
my $input_handle = \*DATA;
open my $output_handle, ">&=", \*STDOUT or die "$0: open: $!";
while (<$input_handle>) {
s!(<value>)(\d+\@google\.com)(</value>)!$1 . substr($2,0,6) . $3!e;
print $output_handle $_;
}
__DATA__
<value>1234@google.com</value>
<value>1235@google.com</value>
<value>12@google.com</value>
输出:
$ ./prog.pl <value>1234@g</value> <value>1235@g</value> <value>12@goo</value>
答案 2 :(得分:1)
您希望截断标记内的文本,该文本可能已短于6个字符,在这种情况下:
s/(<value>[^<]{1,6})[^<]*/$1/
答案 3 :(得分:1)
试试这个:
s|(?<=<value>)(.*?)(?=</value>)|substr $1,0,6|e;
答案 4 :(得分:0)
s/<value>(.{1,6}).*/<value>$1</value>/;