【问题标题】:extract value of an assignment expression提取赋值表达式的值
【发布时间】:2011-02-03 23:46:51
【问题描述】:

假设我有这个字符串:

a b c d e=x f g h i

仅使用 Linux 命令(如 sedawk)从 e=x 中提取值 x 的最佳*方法是什么?

*“最佳”的定义取决于你。

【问题讨论】:

    标签: bash sed awk text-manipulation


    【解决方案1】:

    这个怎么样,只使用 Bash:

    $ s="a b c d e=x f g h i"
    $ s="${s#*=}"
    $ echo "${s%% *}"
    x
    

    使用的参数扩展记录在here

    另一个使用sed:

    $ s="a b c d e=x f g h i"
    $ echo "$s" | sed 's|.*=\([^[:space:]]*\).*|\1|'
    x
    

    再次使用sed

    $ s="a b c d e=x f g h i"
    $ echo "$s" | sed 's|.*=||; s|[[:space:]].*||'
    x
    

    另一个使用cut:

    $ s="a b c d e=x f g h i"
    $ echo "$s" | cut -d = -f 2 | cut -d ' ' -f 1
    x
    

    我个人最喜欢的是第一个:它只需要 Bash 并且不会启动任何额外的进程。

    编辑:

    根据 cmets,这里是上面的表达式,修改为专门匹配 e

    $ s="a b c d e=x f g h i"
    $ s="${s#*e=}"; echo "${s%% *}"
    x
    $ s="a b c d e=x f g h i"
    $ echo "$s" | sed 's|.*\be=\([^[:space:]]*\).*|\1|'
    x
    $ echo "$s" | sed 's|.*\be=||; s|[[:space:]].*||'
    x
    

    【讨论】:

    • Do: $ s="${s#*e=}" 特别是 e 值,如果有多个可以有 =
    • @evan:agreed - 这也可以在所有其他情况下进行相应修改。但是,如果他希望我们处理,OP 应该有更完整的测试输入:-)
    【解决方案2】:

    grep 会吗?假设我正确理解您的问题:

    echo $s | grep -oP '(?<=e\=)[^ ]*'
    

    在哪里s='a b c d e=x f g h i'

    【讨论】:

      【解决方案3】:

      这是一个使用sedawk 的单行:

      $ echo 'a b c d e=x f g h i' | sed 's/=/\n/' | awk '{ getline v; split(v, arr); for (i=1; i<=NF; i++) print $i, "=", arr[i] }'
      a = x
      b = f
      c = g
      d = h
      e = i
      

      过程是使用sed= 处分成两行,然后使用awk 同时循环遍历两行中的列

      【讨论】:

      • 谢谢,虽然我在阅读其他答案后意识到我可能误解了这个问题,哎呀!这似乎仍然可能有用,所以我将保留它。
      【解决方案4】:

      使用 Bash >= 3.2 正则表达式:

      string='a b c d e=x f g h i'
      pattern=' [^ ]*=([^ ]*) '
      [[ $string =~ $pattern ]]
      echo ${BASH_REMATCH[1]}
      

      【讨论】:

        【解决方案5】:

        gAWK

        /=/ {match($0, /\<\w+=\w+\>/, a);print a[0]}
        

        【讨论】:

          【解决方案6】:

          一个可以干净地处理所有这些变量(不确定最终目标)的全 bash 解决方案

          STRING="a b c d e=x f g h i"
          export IFS="="
          while read -d ' ' var value; do
           echo "$var is $value"
          done <<< "$STRING"
          

          【讨论】:

            【解决方案7】:

            如果你的 Linux 系统有 Ruby

            $ echo 'a b c d e=x f g h i' | ruby -e 'puts gets.scan(/=(\w+)/)[0][0]'
            x
            

            或替代

            $ echo 'a b c d e=x f g h i'| tr "=" "\n"| awk 'NR==2{print $1}'
            x
            

            【讨论】:

              【解决方案8】:

              使用现代 perl:

              $ perl -nE 'm/e=(\S*)/;说1美元'

              $ perl -pe 's/.*e=(\S*).*/$1/'

              使用旧版 perl:

              $ perl -ne 'm/e=(\S*)/;打印“$1\n”'

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-08-03
                • 2021-09-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多