【问题标题】:How to use awk under fish to split a string by triple dollar signs ($$$) as field separator?如何在 fish 下使用 awk 以三元符号 ($$$) 作为字段分隔符来拆分字符串?
【发布时间】:2020-06-30 15:40:46
【问题描述】:

awk -F '$' 适用于单美元符号分隔的字符串(例如a$b$c),但当涉及多个美元符号时,awk 不起作用。

预期的输出是:1$23,我尝试了以下组合但徒劳无功:

$ printf '1$23$$$456' | awk -F '$$$' '{print $1}'
1$23$$$456
$ printf '1$23$$$456' | awk -F '\$\$\$' '{print $1}'
1$23$$$456
$ printf '1$23$$$456' | awk -F '\\$\\$\\$' '{print $1}'
1$23$$$456
$ printf '1$23$$$456' | awk -F '$' '{print $1}'
1

我想知道是否有一种方法可以使用 awk 通过一系列美元符号来拆分字符串?

更新

$ awk --version
awk version 20070501
$ echo $SHELL
/usr/local/bin/fish

【问题讨论】:

  • 您使用的是什么 awk 版本? '\\$\\$\\$' 为我工作。
  • ideone.com/lgLEiv, awk -F'\\$\\$\\$' '{print $1}' <<< '1$23$$$456' 输出1$23
  • @BenjaminW。 awk version 20070501vai awk --version
  • 顺便说一下,我用的是鱼壳。
  • 试试-F'[$][$][$]'

标签: linux awk fish


【解决方案1】:

问题出在fish quoting rules。重要的区别在于,与 Bash 不同,fish 允许在单引号字符串中转义单引号,如下所示:

$ echo '\''
'

因此,文字反斜杠也必须转义:

$ echo '\\'
\

所以,要获得 Bash 中对应于 \\ 的内容,我们必须使用 \\\\

$ printf '1$23$$$456' | awk -F '\\\\$\\\\$\\\\$' '{print $1}'
1$23

【讨论】:

    【解决方案2】:

    awk 和各种 shell 具有使用反斜杠转义字符的讨厌行为。各种 shell 可能有不同的行为,有时你真的需要疯狂地逃跑才能让它工作。最简单的方法是将[$] 用于单个符号。这始终适用于字段分隔符,因为FS 是一个正则表达式,如果它有多个符号。

    $ awk -F '[$][$][$]' '{...}' file
    

    【讨论】:

      【解决方案3】:

      更多\

      #> printf '1$23$$$456' | awk -F '\\$\\$\\$' '{print $1}'
      1$23
      

      【讨论】:

      • 感谢您的回答,不幸的是,它不适用于鱼壳。我已经更新了原帖。
      • 不是shell而是awk版本问题:stackoverflow.com/questions/24332942/…。我没有那个版本可以尝试
      • 不,这不是 awk 问题,我在 macOS 上有相同的 awk 版本,它在 Bash 中与 '\\$' 一起工作得很好。这是一个shell引用/转义问题。如果您查看链接的问题,它实际上以“问题不是 awk”结尾;)
      【解决方案4】:

      如果这会让你变得曲线,也许不使用 awk?

      $: echo '1$23$$$456' | sed 's/$$$.*//'
      1$23
      

      为什么要把它放到一个子shell中进行字符串处理?

      $: x='1$23$$$456'
      $: echo "${x%%\$\$\$*}"
      1$23
      

      【讨论】:

      • 我将您的标签从 bash 更改为 linux 和 fish,我不熟悉希望鱼,但也许这仍然会有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 2014-06-29
      • 2018-05-02
      • 2011-02-06
      • 1970-01-01
      相关资源
      最近更新 更多