解析并删除分隔符之间的字符串部分

解析并删除分隔符之间的字符串部分

我想浏览一个文件并删除分隔符之间的某些序列。

例如

 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>

相关内容