Grep - >如何替换文本文件的内容

时间:2011-06-17 18:04:46

标签: perl text replace grep

我有一个包含很多行的文本文件,其布局类似于

zzzzz | id@host.tld |
yyyyy | id@host.tld |

每行大约1000万行中的一行。

使用Grep表达式,如何进行替换以获取

zzzzz
yyyyy

等文件中的每一行

也许使用Perl来重写文件也没关系,我只是不知道很多Perl。

更新1:有时导出会生成:

id@host.tld | zzzzz
id@host.tld | yyyyy

更新2:有时他们将行号留在:

a variable digit row number | zzzzz | id@host.tld |
a variable digit row number | yyyyy | id@host.tld |

更新3:此文件可以包含格式如下的行:

zzzzz | id@host.tld |
yyyyy | id@host.tld |
id@host.tld | zzzzz
id@host.tld | yyyyy
variable digit row number | zzzzz | id@host.tld |
variable digit row number | yyyyy | id@host.tld |

6 个答案:

答案 0 :(得分:5)

也可以使用(GNU)grep来完成:

grep -o '^[^|]*'

修改的:
如果你不想要尾随空格但是想要允许前导空格。在第一个字段中间的空格中,您可以将命令更改为:

grep -o '^[^|]*[^| ]'

答案 1 :(得分:3)

这看起来像是sed的工作:

sed 's/\(.*\) |.*| \(.*\) |.*|/\1 \2/' filename

sed 's/ |[^|]*|//g' filename

修改:
修订后的问题更加容易:

sed 's/ |.*//' filename

你甚至可以逃脱

sed 's/ .*//' filename

但这确实是推动它。

答案 2 :(得分:2)

看起来像编辑的问题 - 或者我可能会失去它:)如果您需要的只是第一部分直到“|”像下面这样的东西应该工作

sed 's/\([^|]*\).*/\1/' filename.txt 

答案 3 :(得分:1)

使用perl ...用于大文件...

use Tie::File;
tie @array, 'Tie::File', 'file.path/file.name' || die;

for (@array) {
    s/^([^\|]+).*/$1/;
}

untie @array;

答案 4 :(得分:1)

Perl one-liner:

perl -e 'while(<>) { /^(.+?) |/ && print "$1\n" }' input.txt > output.txt

应该完美无缺,除非第一个条目可能包含|

答案 5 :(得分:0)

perl会非常简单。

您可以在“|”上进行拆分以获取每行的数组。然后打开要写入的文件,并写入“$ array [0] \ n”

您的程序看起来像:

open IN, '<', "someFile.txt";
@lines = <IN>;
close IN;

open OUT, '>', "outfile.txt";

foreach(@lines){
   chomp;
   @array = split /\s*\|\s*/, $_;
   print OUT $array[0] . "\n";
}
close OUT;

您的更新:

Split是一个函数,它接受一个模式,一个表达式并返回一个字符串数组。所以在上面的例子中。模式是正则表达式。 \ s是一个空格,\ |是“|”。所以它说空间为零或多次(\ s *),管道(\ |)和零个或多个空格(\ s *)。

更新1看起来像:

@array = {
           [0] => "id@host.com"
           [1] => "zzzzzzzzzz"
         }

更新2看起来像:

@array = {
           [0] => "some Number"
           [1] => "zzzzzzzzzz"
           [2] => "id@host.com"
         }