从一行中删除某些字段

joh*_*deo 2 command-line scripts rsync text-processing cut-command

我在文件中有以下几行:

Modified folders: html/project1/old/dev/vendor/symfony/yaml/Tests/bla.yml
Modified folders: html/port5/.DS_Store
Modified folders: html/trap/dev8/.DS_Store
Modified folders: html/bla3/test/appl/.DS_Store
Modified folders: html/bla4/pro1/app/bla/Api2.php
Modified folders: html/bla10/dev/appl/language/.DS_Store
Modified folders: html/bla11/dev/appl/language/abc.txt
Run Code Online (Sandbox Code Playgroud)

这基本上是rsync. 我想列出文件的所有行,最多 3 个目录位置,例如

Modified folders: html/project1/old
Modified folders: html/port5
Modified folders: html/trap/dev8
Modified folders: html/bla3/test
Modified folders: html/bla4/pro1
Modified folders: html/bla10/dev
Modified folders: html/bla11/dev
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我提供任何命令或 shell 脚本来做同样的事情吗?

Zan*_*nna 6

也许是这样的:

$ sed -r 's|/[^/]*$||' file | sed -r 's|([^/]*/?[^/]*/?[^/]*).*|\1|'
Modified folders: html/project1/old
Modified folders: html/port5
Modified folders: html/trap/dev8
Modified folders: html/bla3/test
Modified folders: html/bla4/pro1
Modified folders: html/bla10/dev
Modified folders: html/bla11/dev
Run Code Online (Sandbox Code Playgroud)

或者您可以使用以下方法完成第二部分cut

sed -r 's|/[^/]*$||' file | cut -d '/' -f 1,2,3
Run Code Online (Sandbox Code Playgroud)

笔记

  • -r 使用ERE
  • s|old|new|替换oldnew
  • [^/]* 任意数量的字符 /
  • $ 行结束
  • /? 零或一 /
  • (pattern)保存pattern以供稍后参考\1
  • .* 任意数量的任意字符
  • | (未加引号的)shell 管道 - 将左侧命令的输出传递到右侧命令
  • cut -d '/'使用/作为分隔符
  • -f 1,2,3 打印前三个字段