【问题标题】:bash: how do I substring all but what is in single quotes?bash:除了单引号中的内容之外,我如何对所有内容进行子串化?
【发布时间】:2011-12-12 10:40:44
【问题描述】:

比如说,下面的命令: 少一些文件名 | grep -w 'some_text' 给出以下输出:

  some_text =  'x.y.z';

例如,像 1.12.5 这样的 x、y、z 数字,我如何将输出剥离为

x.y.z ?

应该可以使用一些正则表达式或 sed/awk 左右,但无法弄清楚。

【问题讨论】:

    标签: regex bash substring


    【解决方案1】:
    echo " some_text =  '12.3.012';" | sed -r "s/[^']+'([.0-9]+)'\s*;/\1/"
    

    【讨论】:

    • 再次感谢 :) 这个也适用于我。所以现在我有三个选项,两个与我一直在寻找的一样,还有一个易于理解的第三个新选项。
    【解决方案2】:

    我发现在使用grep 时,cut 是我的朋友。您可以剪切字符或字段。在这种情况下,您需要类似:

    echo "some_text = 'x.y.z'" | cut -d\' -f2

    -d 参数指定分隔符(此处转义),-f 指定字段编号(从 1 开始)。

    如果您的数据可能位于不同的字段中,那么您必须想出一个与您想要的部分匹配的正则表达式。喜欢

    cat file | grep -o x\.y\.z

    -ogrep 表示只返回匹配的部分。

    【讨论】:

    • 在我尝试过的所有事情中,缺少“剪切”选项。这个也适用于我,两者都喜欢我正在寻找和可以理解的东西。谢谢。
    • @slibbe 请检查此答案为“这对我有帮助”
    【解决方案3】:

    通过 awk:

    kent$  echo "some_text =  'x.y.z';"|awk -F"'" '{print $2}'
    x.y.z
    

    实际上你也可以在你的 grep 行上做一些事情。例如

    less somefile | grep -Po "(?<=some_text =  ')[^']*(?=')"
    

    【讨论】:

    • 谢谢。第一部分对我有用。不过,由于某种原因,grep 选项不会。
    【解决方案4】:

    这将同时进行行匹配和内容提取:

    awk -F"'" '/some_text/{print $2}' some_filename
    

    例如:

    [me@home]$ cat some_filename 
    random data 
    some_text =  'x.y.z'; 
    another_text = '1.2.3.4';
    
    [me@home]$ awk -F"'" '/some_text/{print $2}' some_filename 
    x.y.z
    

    awk 命令的简要说明:

    • -F"'" :将字段分隔符更改为'。这将有效地将“some_text = 'x.y.z'”之类的字符串拆分为 3 个字段 - “some_text =”、“x.y.x”和“;
    • /some_text/ :仅匹配包含“some_text”的行
    • {print $2} :对于每个匹配行,打印第二个字段(在本例中为“x.y.z”)

    【讨论】:

    • 谢谢。尽管在这种情况下自己寻找答案可能非常有用,但我应该开始更快地询问:)
    【解决方案5】:

    Prince John Wesley solution,只是加号搜索some_text

    sed -n "/some_text/ s@.*'\([^']*\)'.*@\1@p"
    

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 2017-06-03
      • 2019-07-21
      • 2011-10-18
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多