【问题标题】:What is an effective Awk/Nawk pattern for extracting path/filenames from input? [closed]从输入中提取路径/文件名的有效 Awk/Nawk 模式是什么? [关闭]
【发布时间】:2012-04-09 01:25:36
【问题描述】:

输入包含分散在各处的文件名 (/path/to/file)。 我只想要/path/to/xyz.xyz(空格或换行符,但绝不是'\' [文件中的空格])。

规则是:

  • 以“/”开头 - 开始
  • 以“”结尾(但不是“\”)或“\n”
  • 介于两者之间。

仅附加路径+基本名称。不是基本名称。

【问题讨论】:

  • 即使在编辑之后我仍然不明白要问什么...这些答案对你有用吗?如果是,请将其中之一标记为已接受。如果不是,请在答案下方评论预期输出和观察到的输出之间的差异。

标签: regex string bash awk


【解决方案1】:

以下

{
  r = 0;
  s = $0;
  do
  {
    r = match(s, /\/([^ ]|\\ )+/ );
    if ( r > 0 )
    {
      print substr(s, RSTART, RLENGTH);
      s = substr(s, RSTART + RLENGTH);
    }
  }
  while ( r > 0 );
}

也许是你想要的。 (注意:路径“/”因为+号没有被抓到,如果你用*代替会被抓到)。

【讨论】:

    【解决方案2】:

    您可以依靠awk 进行拆分,以便文件名不包含空格,然后只需查找以/ 开头的任何字段:

    awk '{ for (i = 1; i <= NF; i++) if (substr($i, 1, 1) == "/") print $i }'
    

    【讨论】:

      【解决方案3】:
      $ txr -c '@(freeform)
      @(coll)@{path /\/[^ \n]*/}@(end)' -
      asfasdf /foo/bar asdfasdf/xyzzy.gif /blah
      /usr/local/bin .2466 /etc
      [Ctr-D][Enter]
      path[0]="/foo/bar"
      path[1]="/xyzzy.gif"
      path[2]="/blah"
      path[3]="/usr/local/bin"
      path[4]="/etc"
      

      这会转储原始绑定,从而允许整个命令在 Bash 中为eval-ed 以创建数组。 (对输出格式没有要求。)

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2016-06-19
        • 2013-07-13
        • 1970-01-01
        • 2014-07-26
        相关资源
        最近更新 更多