多行grep不在列表中
我有一条别人提供给我的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 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
工作原理:
这告诉awk使用-F'[]'
作为字段分隔符
对于包含st/“desc/{printf”%s%s“,c$3;c=“,”}
,这告诉awk打印变量“desc
,然后打印第三个字段。第三个字段是我们想要的数字。变量c
最初是空字符串,但在第一次打印后,我们将其设置为逗号,c
。这会导致打印我们想要打印的数字,每个数字用逗号分隔,
读取完文件后,这会告诉awk打印换行符END{print”“}
- 您的解决方案不起作用的原因是
{“>| |您的解决方案不起作用的原因是{“>| |您的内容具有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 ","