awk 使用逗号(可选)后跟多个空格作为 FS

发布于 2024-08-16 18:31:22 字数 247 浏览 6 评论 0原文

我需要做的是解析以下形式的字符串

-option optionArgument, --alternativeNotation 一些文本,没什么兴趣...

我将 FS 设置为

BEGIN {
    FS = ",?\ +" 
}

但它不起作用...它应该在每个随机数上中断空格(至少一个),前面加一个逗号(可选)。有什么想法吗?

提前致谢,

奥利弗

What I need to do is parse a string of the following form

-option optionArgument, --alternativeNotation Some text, nothing of interest...

I set the FS to

BEGIN {
    FS = ",?\ +" 
}

but it didn't work... it should break on every random number of blanks (at least one), preceeded by a comma (optional). Any ideas?

Thx in advance,

Oliver

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

月下伊人醉 2024-08-23 18:31:22

您的 FS 执行您在问题中描述的操作,但空格之前的反斜杠可能是多余的,具体取决于 shell 引用:

$ echo '-option optionArgument, --alternativeNotation Some text, nothing of interest...' |  \
  nawk 'BEGIN {
          FS=",? +";
          OFS="][";
        }
        {
          print "["$1,$2,$3,$4"]";
          print "["$5,$6,$7,$8"]";
        }'
[-option][optionArgument][--alternativeNotation][Some]
[text][nothing][of][interest...]

您希望字段是什么?

Your FS does what you describe in your question, but the backslash before the space might be redundant depending on shell quoting:

$ echo '-option optionArgument, --alternativeNotation Some text, nothing of interest...' |  \
  nawk 'BEGIN {
          FS=",? +";
          OFS="][";
        }
        {
          print "["$1,$2,$3,$4"]";
          print "["$5,$6,$7,$8"]";
        }'
[-option][optionArgument][--alternativeNotation][Some]
[text][nothing][of][interest...]

What do you want the fields to be?

瑕疵 2024-08-23 18:31:22

FS = "[,]*[ ]+"

这使得逗号可选,但空格不可选。这会在每个 -option 和 optionArg 中创建一个单独的字段,我相信这是您想要的。

awk 'BEGIN {FS = "[,]*[ ]+";} { print $1; print $2; print $3; print $4; print $5;}' << EOF
> -option1 hello, --option2 world, -option3
> EOF
-option1
hello
--option2
world
-option3

FS = "[,]*[ ]+"

This makes the comma optional but not the space. This creates a separate field out of each -option and optionArg which is what I believe you wanted.

awk 'BEGIN {FS = "[,]*[ ]+";} { print $1; print $2; print $3; print $4; print $5;}' << EOF
> -option1 hello, --option2 world, -option3
> EOF
-option1
hello
--option2
world
-option3
纸短情长 2024-08-23 18:31:22

@OP,下次尝试描述你的最终输出是什么。

echo "-option1 hello,          --option2 world, -option3" | awk 'BEGIN{FS=",[ ]+"}
{
    for(i=1;i<=NF;i++){
        print $i
    }
}
'

输出

$ ./shell.sh
-option1 hello
--option2 world
-option3

另外,实际上不需要检查多个空格。只需使用逗号作为分隔符,然后修剪剩余的空格即可。

echo "-option1 hello,          --option2 world, -option3" | awk 'BEGIN{FS=","}
{
    for(i=1;i<=NF;i++){
        gsub(/^ +| +$/,"",$i)
        print $i
    }
}
'

输出

$ ./shell.sh
-option1 hello
--option2 world
-option3

@OP, next time try to describe what your final output is.

echo "-option1 hello,          --option2 world, -option3" | awk 'BEGIN{FS=",[ ]+"}
{
    for(i=1;i<=NF;i++){
        print $i
    }
}
'

output

$ ./shell.sh
-option1 hello
--option2 world
-option3

Also, there is actually no need to check for multiple blanks. Just use comma as the delimiter and trim the remaining spaces later.

echo "-option1 hello,          --option2 world, -option3" | awk 'BEGIN{FS=","}
{
    for(i=1;i<=NF;i++){
        gsub(/^ +| +$/,"",$i)
        print $i
    }
}
'

output

$ ./shell.sh
-option1 hello
--option2 world
-option3
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文