【问题标题】:Blank sed output after substitution using -n使用 -n 替换后的空白 sed 输出
【发布时间】:2013-01-10 14:55:40
【问题描述】:

对于知道的人来说可能是一个简单的问题,但我很难从文件中检索一些变量值。我的文件是这样的:

variable1 12
variable2 43
variable3 897

我想得到变量 2 的值,43。

我用 sed 尝试了一些命令,但没有成功:

sed -n 's/variable2 //;s/variable3//' myFile

【问题讨论】:

    标签: linux bash shell sed grep


    【解决方案1】:

    仅限 sed:

    $ sed -n 's/^variable2 //p' file
    43
    

    您的问题是您使用-n 来抑制sed 的输出,因此您需要p 标志,以便sed 打印发生替换的行。

    因为这只是模式匹配,所以我会使用 only grep 来解决这个问题:

    $ cat file
    variable1 12
    variable2 43
    variable3 897
    
    $ grep -Po '(?<=^variable2 )\d+' file
    43
    

    或者甚至只是awk:

    $ awk '$1=="variable2"/{print $2}' file
    43
    

    【讨论】:

    • 虽然我喜欢grep -Po,但我很少推荐它,因为它不是很便携。不过,+1 为您的sed 解决方案。
    • @ghoti 我想说绝大多数Linux和OSX都带有GNU sed,出于好奇,哪里不支持?
    • GNU/Linux 系统通常带有 GNU sed,但 OSX、FreeBSD、Solaris、HP/UX 等都有自己的。好吧,OSX 的 sed 是从 FreeBSD 派生的,并且 Solaris 附带 SysV 和 BSD sed,直到版本 11。但是您的 sed 解决方案很好,并且可移植。这是 grep 的 -P 选项,在 FreeBSD 或除 OSX 之外的任何其他系统中都没有,OSX 在版本 10.6 中开始支持它。它当然不是通用的。
    • 如果文件包含variable20,您的awk 解决方案将失败。在寻找固定字符串时,最好测试固定字符串。 awk '$1=="variable2"{print $2}' 或者 pepoluan posted,因为它提供了更好的灵活性。
    【解决方案2】:

    你必须使用sed吗?

    我更喜欢使用awk 来处理这类事情:

    awk -v varname="variable2" '$1==varname {print $2}' myFile
    

    只要没有包含空格的变量(在左列中),这将起作用。

    编辑:

    由于标题是“用bash从文件中获取变量值”,所以这里是一个不涉及外部程序的版本

    wantvar="variable2"
    datafile="myFile"
    while read varname varval; do
      # Case-insensitive matching. If you need case-sensitivity, remove the pair of commas
      # on both sides.
      if [[ ${varname,,} = ${wantvar,,} ]]; then
        echo $varval
        break
      fi
    done < $datafile
    

    【讨论】:

    • 传递varname 没有任何好处,如果你做内联赋值,还不如awk '$1=="variable2"{print $2}' file 加上这样的事情远离bash。
    • @sudo_O 是的。以防万一提问者想将该行嵌入到某个脚本中。至于您的第二个陈述,问题的 title 是“... with bash”。我编写脚本是为了防止提问者做一些完全不必要的事情,比如some_variable="$(awk ....)"
    • 不要挂断标题,我已经更改它以反映问题,OP 只是错过了 p 标志到 sed。真的bash不适合这种东西!
    【解决方案3】:

    使用grep查找行,然后使用cut提取值:

    $ grep ^variable2 myFile | cut -d ' ' -f 2
    

    测试:

    $ cat myFile 
    variable1 12
    variable2 43
    variable3 897
    $ grep ^variable2 myFile | cut -d ' ' -f 2
    43
    $ 
    

    【讨论】:

      【解决方案4】:

      对于这样格式的文件,grep|awk 将起作用:

      grep variable2 文件 | awk '{print $2}'

      对于格式稍有不同的文件,不要指望它。

      【讨论】:

      • 这是多余的,不需要从 grep 管道到 awk。见pepoluan's answer
      • 或者看我的.. 要么使用grep 要么 awk 两者都是一个进程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多