我想浏览一个文件并删除分隔符之间的某些序列。
例如
drw---- 00000000 11111111 0 ./a/
drw---- 00000000 11111111 0 ./b/
d------ 00000000 11111111 0 ./c/
d------ 00000000 11111111 0 ./d/k/
d------ 00000000 11111111 0 ./e/l/r/
d------ 00000000 11111111 0 ./f/m/s/x/
------- 00000000 11111111 89 ./g/n/t/y/C.xml
dr----- 00000000 11111111 0 ./h/o/u/z/
dr-r--- 00000000 11111111 0 ./i/p/v/A/D/
d--r--- 00000000 11111111 0 ./j/q/w/B/
会成为
drw---- ./a/
drw---- ./b/
d------ ./c/
d------ ./d/k/
d------ ./e/l/r/
d------ ./f/m/s/x/
------- ./g/n/t/y/C.xml
dr----- ./h/o/u/z/
dr-r--- ./i/p/v/A/D/
d--r--- ./j/q/w/B/
其中起始分隔符是文件中的第二个空格,结束分隔符是 ./
我对 cygwin 及其所有智能工具都还很陌生,所以我不知道该怎么做。我很确定我可以以某种方式使用 sed 和正则表达式,但我只是不太了解,无法自己想出解决方案。
答案1
最简单的方法是使用awk
。
$ awk '{print $1, $5}' myfile.txt
awk
逐行读取文件,设置一些特殊变量并对每一行运行命令。当使用空格作为分隔符对一行进行标记时,这里包含第一个和第五个字符串$1
。$5
答案2
这是您想要的正则表达式。在 vim 中打开文件并运行它,或者执行sed the_expression oldname > newname
。
:%s/[0-9][0-9]*//g
说明:
% 符号指定应在整个文件上运行以下命令。
s
意味着search/for this expression/and replace it with this one/
在您的情况下,您想要删除所有数字,因此我们指示 vim 的正则表达式引擎搜索一个或多个数字的每次出现并将其替换为零。
答案3
“其中起始分隔符是文件中的第二个空格,结束分隔符是 ./”
这是专为你准备的丑陋
C:\sdf>type p.p
drw---- 00000000 11111111 0 ./a/
drw---- 00000000 11111111 0 ./b/
d------ 00000000 11111111 0 ./c/
d------ 00000000 11111111 0 ./d/k/
d------ 00000000 11111111 0 ./e/l/r/
d------ 00000000 11111111 0 ./f/m/s/x/
------- 00000000 11111111 89 ./g/n/t/y/C.xml
dr----- 00000000 11111111 0 ./h/o/u/z/
dr-r--- 00000000 11111111 0 ./i/p/v/A/D/
d--r--- 00000000 11111111 0 ./j/q/w/B/
C:\sdf>sed -r "s/(\s+\S+\s*)([^.]*\.\/)/\1.\//" p.p
drw---- ./a/
drw---- ./b/
d------ ./c/
d------ ./d/k/
d------ ./e/l/r/
d------ ./f/m/s/x/
------- ./g/n/t/y/C.xml
dr----- ./h/o/u/z/
dr-r--- ./i/p/v/A/D/
d--r--- ./j/q/w/B/
C:\sdf>