regex - 替换大日志文件中的字符

标签 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 位的所有内容并保留第二列的位置?

\\Edit: 问题是从位置 1 到 17 也可能是数字之间的空格。这是我认为可能有效的逻辑:
1.从位置。 1 到 17 替换 '(', ')', '-' 到 ' ' [空格]
2.从位置。 1 到 17 将 ' ' [空格] 替换为 '' [无] 并计算变化
3.从位置。 1到17根据上一步的变化在数字后加空格

最佳答案

好吧,如果你安装 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”的文件中,或者如果您喜欢它,请选择一个更好的名称:

{
  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 样式转换为 unix 样式。 dos2unixfromdos 可能对您有所帮助(Google 是您的好 helper )。

关于regex - 替换大日志文件中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15971458/

相关文章:

java - 正则表达式小数(动态)Java

python - Python 中类似 Excel 的文本导入 : automatically parsing fixed width columns

c++ - 在 3D 世界的显示器上的固定位置绘制 2D 文本 - OpenGL

JavaScript 正则表达式替换字符串的所有部分,但包含特定字符串的部分除外

java - 如何用 Java 替换 pdf 中的多个 url,最好使用 PdfBox

python - 用相应的减法结果替换字符串中的数字

ruby - 如何在另一个正则表达式中使用 Regexp.union?

撇号内的 Javascript RegEx

regex - 如何在 Elixir 中操作正则表达式替换字符串

linux - 如何拆分字符串并使用 cut 打印所有子字符串