如何在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在数字后面添加空格
答案 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。可以帮助您的一个工具是dos2unix
或fromdos
(谷歌是您的朋友)。
答案 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