多行grep不在列表中

多行grep不在列表中,grep,Grep,我有一条别人提供给我的grep线路,我不知道如何更改 最初的路线是: grep id=\"desc\"* $ADDON_SETTINGS | awk -v ORS=, '{gsub(/"/, "");print $2}' | tr -s 'value=' ' ' | sed 's/ //g' | echo "[$(cat)]" 它来自一个包含以下内容的文件(这是一个示例段): 现在,生成数据文件的程序已将数据更改为如下所示: <settings version="2"> <

我有一条别人提供给我的grep线路,我不知道如何更改

最初的路线是:

grep id=\"desc\"* $ADDON_SETTINGS | awk -v ORS=, '{gsub(/"/, "");print $2}' | tr -s 'value=' ' ' | sed 's/ //g' | echo "[$(cat)]"
它来自一个包含以下内容的文件(这是一个示例段):

现在,生成数据文件的程序已将数据更改为如下所示:

<settings version="2">
  <setting id="allc" default="true">false</setting>
  <setting id="cfirst" default="true">false</setting>
  <setting id="cicons" default="true">false</setting>
  <setting id="days">3</setting>
  <setting id="delay" default="true">0</setting>
  <setting id="desc01">10</setting>
  <setting id="desc02">18</setting>
  <setting id="desc03">6</setting>
  <setting id="desc04">13</setting>
...

假的
假的
假的
3.
0
10
18
6.
13
...
我想这可能更容易,因为我只需要将值拉到>和<之间,但是如果我使用这个:

grep id=\"desc\"* $ADDON_SETTINGS | awk -v ORS=, '{">|<";print $3}' | echo "[$(cat)]" 
grep id=\“desc\”*$ADDON\u设置| awk-v ORS=,“{”>试试:

$awk-F'[]''/“desc/{printf”%s%s“,c,$3;c=“,”}结束{print”“}文件
10,18,6,13
工作原理:

  • -F'[]'

    这告诉awk使用
    作为字段分隔符

  • /“desc/{printf”%s%s“,c$3;c=“,”}

    对于包含st
    的任何行desc
    ,这告诉awk打印变量
    c
    ,然后打印第三个字段。第三个字段是我们想要的数字。变量
    c
    最初是空字符串,但在第一次打印后,我们将其设置为逗号,
    。这会导致打印我们想要打印的数字,每个数字用逗号分隔

  • END{print”“}

    读取完文件后,这会告诉awk打印换行符

试试:

$awk-F'[]''/“desc/{printf”%s%s“,c,$3;c=“,”}结束{print”“}文件
10,18,6,13
工作原理:

  • -F'[]'

    这告诉awk使用
    作为字段分隔符

  • /“desc/{printf”%s%s“,c$3;c=“,”}

    对于包含st
    “desc
    ,这告诉awk打印变量
    c
    ,然后打印第三个字段。第三个字段是我们想要的数字。变量
    c
    最初是空字符串,但在第一次打印后,我们将其设置为逗号,
    。这会导致打印我们想要打印的数字,每个数字用逗号分隔

  • END{print”“}

    读取完文件后,这会告诉awk打印换行符


    • 您的解决方案不起作用的原因是
      {“>| |您的解决方案不起作用的原因是
      {“>| |您的内容具有html/xml格式。
      正确的方法是使用html/xml解析器

      解决方案:

      示例
      input.html
      内容:

      <settings version="2">
        <setting id="allc" default="true">false</setting>
        <setting id="cfirst" default="true">false</setting>
        <setting id="cicons" default="true">false</setting>
        <setting id="days">3</setting>
        <setting id="delay" default="true">0</setting>
        <setting id="desc01">10</setting>
        <setting id="desc02">18</setting>
        <setting id="desc03">6</setting>
        <setting id="desc04">13</setting>
      </settings>
      
      这将提取属性为
      id
      且包含
      “desc”
      标记值,并使它们成为数组
      res

      检查第二个数组项值:

      echo ${res[1]}
      18
      

      您的内容具有html/xml格式。
      正确的方法是使用html/xml解析器

      解决方案:

      示例
      input.html
      内容:

      <settings version="2">
        <setting id="allc" default="true">false</setting>
        <setting id="cfirst" default="true">false</setting>
        <setting id="cicons" default="true">false</setting>
        <setting id="days">3</setting>
        <setting id="delay" default="true">0</setting>
        <setting id="desc01">10</setting>
        <setting id="desc02">18</setting>
        <setting id="desc03">6</setting>
        <setting id="desc04">13</setting>
      </settings>
      
      这将提取属性为
      id
      且包含
      “desc”
      标记值,并使它们成为数组
      res

      检查第二个数组项值:

      echo ${res[1]}
      18
      

      grep介于
      desc\d+”>
      grep介于
      desc\d+”>
      之间的数字这可能是最好的方式,因为文件是xml。我使用:
      xmlstarlet sel-t-v”/settings/settings[contains(@id,'cicons')”来计算常规设置。”$ADDON_SETTINGS
      但我需要输出所有
      “desc”的值
      行之间带有逗号。因此,上面代码段的输出应为
      10,18,6,13
      @edit4ever,只要将
      tr'\n''更改为
      tr'\n'',
      ,您就会得到所需的序列这可能是最好的方式,因为文件是xml。我使用
      xmlstarlet sel-t-v来计算常规设置“/settings/setting[contains(@id,'cicons')]”“$ADDON_settings
      但是我需要输出所有
      “desc”
      行的值,中间有一个逗号。因此上面代码段的输出应该是
      10,18,6,13
      @edit4ever,只要将
      tr'\n'
      更改为
      tr'\n',
      ,就可以得到所需的序列
      awk 'match($0,/id=\"desc[0-9]+\">([0-9]+)/, a){printf "%s%s",sep,a[1];sep=","} END{print ""}' input.txt
      10,18,6,13
      
      $ cat tst.awk
      match($0,/id=\"desc[0-9]+\">([0-9]+)/, a){
         printf "%s%s",sep,a[1];sep=","
      }
      END{print ""}
      
      $ awk -f tst.awk input.txt
      10,18,6,13
      
      <settings version="2">
        <setting id="allc" default="true">false</setting>
        <setting id="cfirst" default="true">false</setting>
        <setting id="cicons" default="true">false</setting>
        <setting id="days">3</setting>
        <setting id="delay" default="true">0</setting>
        <setting id="desc01">10</setting>
        <setting id="desc02">18</setting>
        <setting id="desc03">6</setting>
        <setting id="desc04">13</setting>
      </settings>
      
      res=($(xmlstarlet sel -t -v "//setting[contains(@id, 'desc')]" 1.html | tr '\n' ' '))
      
      echo ${res[1]}
      18
      
      grep -oP 'desc\d+">\K\d+(?=<)' file | paste -sd ","