【问题标题】:Unix command to strip off part of a lineUnix命令剥离一行的一部分
【发布时间】:2012-02-20 01:47:30
【问题描述】:

我正在使用命令行 SVN。来自 Windows 上的 TortoiseSVN,每当我尝试选择一个特定的文件来还原、比较、提交等时,我发现它非常乏味,因为路径很长,如下所示:

src/com/company/stuff/platform/appname/subpackage/subsubpackage/Foo.java

如果我想对这个文件做一个差异,我必须输入所有这些:

svn diff src/com/company/stuff/platform/appname/subpackage/subsubpackage/Foo.java

所以,我尝试这样做:

svn st | grep Foo

但它会返回:

M       src/com/company/stuff/platform/appname/subpackage/subsubpackage/Foo.java

现在,我如何去掉“M”部分,这样我就可以只得到文件路径了?

【问题讨论】:

    标签: svn shell unix command-line grep


    【解决方案1】:
    svn st | grep Foo | sed 's/M *//'
    

    【讨论】:

      【解决方案2】:
      svn st | grep Foo | sed 's/^[A-Z]\s*//'
      

      【讨论】:

      • 在玩过 sed 之后,我想出了 sed 's/. *//',它也适用于未提交的文件 ('?')。
      • @alnite 请记住将^ 字符告诉sed 只在行首查找。
      【解决方案3】:

      如果'svn st'总是返回一个(不需要的)第一列,然后是路径,试试这个:

      svn st | grep Foo | awk '{print $2}'
      

      【讨论】:

      • 这看起来更干净。
      【解决方案4】:

      为此,我会使用awk

      svn st | awk '/Foo/ { print $2 ; }'
      

      awk 使用带有 匹配 指令的脚本和代码块在匹配的行上执行。这将匹配带有Foo 的行并打印第二个字段。 (使用默认的FS 字段分隔符,应该按制表符和空格分隔。)

      你还应该研究一下你的 shell 的文件名补全能力;大多数较新的 shell 包括完成部分类型文件名的能力。对于您的长示例:

      src/com/company/stuff/platform/appname/subpackage/subsubpackage/Foo.java
      

      我可能会这样输入:

      src/com/com<tab>/stuff/pla<tab>/appn<tab>/subp<tab>/subsub<tab>/Foo<tab>
      

      您可能需要输入更多或更少的内容,具体取决于目录中的文件。

      【讨论】:

      • 我做了标签,这也很乏味。 type-tab-slash-type-tab-slash -... 您的解决方案似乎是最优雅的。没有grep。
      猜你喜欢
      • 2012-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多