使用awk提取带空格的文件名

使用awk提取带空格的文件名

我有这行输出:

M file.txt

进入这个 awk 程序:

awk '{printf("\t%s: %s %s\n", FNR, $1, $2)}'

返回

1: M file.txt

这是可行的并且是通常的情况。但是,如果文件有空格并且输出行如下所示:

M "tmux split-window subcommand.md"

awk 给出了这个:

1: M "tmux

但期望的输出是这样的:

1: M "tmux split-window subcommand.md"

我怎样才能解决这个问题?

答案1

要使用以下命令将行号添加到当前行awk

awk '{ printf("%d: %s\n", FNR, $0) }'

第零个字段$0是完整的行。

答案2

如果您使用分隔符,它不会将引号之间的空格视为单独的单词。

因此,我们可以使用您认为不会出现在输入字符串中的任何分隔符。

echo 'M "tmux split-window subcommand.md"' | awk -F: '{printf("\t%s: %s %s\n", FNR, $1, $2)}' 1: M "tmux split-window subcommand.md"

答案3

尝试这个:

  #!/usr/bin/awk -f
  BEGIN {
        #FPAT = "([^,]+)|(\"[^\"]+\")" # seperator is ,
        #FPAT = "([^,]*)|(\"[^\"]*\")" # seperator is , and allow empty field -> notice the "+" changed to "*"
        FPAT = "([^ ]+)|(\"[^\"]*\")" # seperator is <space> -> notice the "," changed to " "
  }
  {
    printf("%d: ", FNR);
        for (i = 1; i <= NF; i++) {
            printf("%s ", $i)
        }
    printf("\n");
  }

我从 GNU awk 的在线手册中得到它。就这个。 https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html

相关内容