替换大日志文件中的字符

时间:2013-04-12 12:29:17

标签: regex text replace large-files

如何在Windows下更改非常大的日志文件:

   3334-444-(4)  anything   anything2
   4444-444-(4)  anything   anything2
   4744-454-(4)  anything   anything2
   48444 44-(4)  anything   anything2
   8444-444-(4)  anything   anything2
   4464-(444)-2  anything   anything2

到此:

33344444         anything   anything2
44444444         anything   anything2
47444544         anything   anything2
48444444         anything   anything2
84444444         anything   anything2
44644442         anything   anything2

删除除数字以外的每一行中的所有位置18并保留第二列的位置?

\\编辑:问题是从位置1到17也可能是数字之间的空格。这是我认为可行的逻辑:
1.从pos。 1到17将'(',')',' - '替换为''[space]
从pos。 1到17将''[space]替换为''[nothing]并计算更改
3.从pos。根据上一步的每次更改,1到17在数字后面添加空格

6 个答案:

答案 0 :(得分:1)

好吧,如果您安装cygwin,则可以使用命令行工具

的强大功能
$ sed 's/[-)(]//g' input
33344444  anything   anything2
44444444  anything   anything2
47444544  anything   anything2
48444444  anything   anything2
84444444  anything   anything2
44644442  anything   anything2

<强>更新

有时将复杂任务划分为较小的部分会更容易。

假设输入如下(添加标尺)

         1         2         3         4         5
12345678901234567890123456789012345678901234567890
   3334-444-(4)  anything   anything2
   4444-444-(4)  anything   anything2
   4744-454-(4)  anything   anything2
   48444 44-(4)  anything   anything2
   8444-444-(4)  anything   anything2
   4464-(444)-2  anything   anything2

第1步是使用cut,删除前17个字符,删除不需要的字符并存储在tmp文件中。

第2步是将字符18剪切为行尾并存储在tmp文件中。

第3步是将tmp文件合并到一个文件中。

这样的事情:

$ cut -c1-17 input | sed 's/[-)( ]*//g' > c1

$ cut -c18- input > c2

$ paste c1 c2

如果这不符合您的审美意识,您可以使用awk一次性完成所有操作。将以下行放在名为“col.awk”的文件中,或者如果你喜欢它,请选择一个更好的namne:

{
  x = substr($0, 0, 17)
  y = substr($0, 18, length($0))
  gsub(/[-)( ]*/, "", x)
}
{ printf "%-18s%s\n", x, y }

然后这样称呼:

$ awk -f col.awk input

输出(再次使用标尺):

         1         2         3         4         5
12345678901234567890123456789012345678901234567890
33344444         anything   anything2
44444444         anything   anything2
47444544         anything   anything2
48444444         anything   anything2
84444444         anything   anything2
44644442         anything   anything2

请注意,cygwin喜欢拥有unix样式行结尾的所有内容,因此您可能需要将输入从windows-style转换为unix-style。可以帮助您的一个工具是dos2unixfromdos(谷歌是您的朋友)。

答案 1 :(得分:0)

您可以尝试Ultra Edit。它是一个编辑器,允许您在列模式下进行选择,这样您就可以选择前18个字符并以此方式进行替换。

唯一想到的是使用具有宏功能的编辑器来执行此操作。

或者写一个快速而又脏的程序。

答案 2 :(得分:0)

使用下面的正则表达式并替换为“”(空字符串)

[-\(\)]

希望它有所帮助。

答案 3 :(得分:0)

下载notepad++。打开文档,然后按CTRL + h进行搜索并替换。

在“查找内容”框中使用此正则表达式:

^([0-9]+)\-?\(?([0-9]+)\)?\-?\(?([0-9]+)\)?

并在“替换为”框中:

\1\2\3

在搜索模式中选择“正则表达式”,然后替换所有。

答案 4 :(得分:0)

真的,不确定,Windows可以做到这一点。

但是..

您可以安装Perl - 用于文本和字符串操作的良好语言。

或者找到linux机器。

您可以在此处找到安装程序:Strawberry

安装完成后,只需在控制台(cmd.exe

中运行即可
  

perl -i.bak -ne's / ^ \ s //&amp;&amp; s / [ - ()] // g&amp;&amp; S / \ S / \吨/;打印;' input.txt中

这将保存您的备份文件(input.txt.bak),您可以在input.txt文件中进行更改。

答案 5 :(得分:0)

使用sed:

sed -E ':a;s/^([0-9]*)([( ]|-\(?|\)-?)([0-9]+)\)?/\1\3/;ta;s/[ \t]+/         /;' file
相关问题