如何在 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 样式。 dos2unix
或 fromdos
可能对您有所帮助(Google 是您的好 helper )。
关于regex - 替换大日志文件中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15971458/