在 bash 中,我从文件中读取一个字符串,如下所示:
"network": "Purple",
我将如何使用 grep、awk 甚至 sed 只提取字符串:“Purple”(不带引号)并将其分配给变量?
我需要去掉末尾的引号和逗号。
在某些情况下,它可能不包含“紫色”一词,但可能是其他颜色,但始终是单个单词。
我一直在尝试以下代码,但无法使其完美。
#!/bin/bash
NETWORK=`cat generalInfo.info | grep network | awk '{print $2}'`
if [ $NETWORK -eq "Purple" ]; then
echo "This network is Purple"
else
echo "This network is not Purple"
fi
exit 0
到目前为止,这段代码让我得到“紫色”,但需要去掉周围的引号和逗号。使用双引号作为 awk 的分隔符会更容易吗?
GeneralInfo.info 文件只是一个类似 json 格式的文本文件。我读过,我可以使用 jq 来解析文件,但在我的特定实例中,我没有安装 jq 并且无法安装它。
谢谢你的帮助。
答案1
有很多方法可以做到这一点。但是,正如评论中已经提到的,如果这实际上是结构化 JSON 数据,您可能需要研究类似jq
旨在解析 JSON 的内容。
对于您提到的简单情况,这里有几个选项:
awk
$ echo '"network": "Purple",' | awk '/network/{ gsub(/[",]/,"",$2); print $2}' Purple
GNU grep
$ echo '"network": "Purple",' | grep -oP '"network":\s*"\K[^"]+' Purple
sed
$ echo '"network": "Purple",' | sed -n 's/"network": *"\([^"]*\).*/\1/p' Purple
或者
$ echo '"network": "Purple",' | sed -En 's/"network":\s*"([^"]+).*/\1/p' Purple
最后,尽量避免在 shell 脚本中使用全大写变量名。按照惯例,全局环境变量都是大写的,如果您自己的变量名也大写,这可能会导致混乱。在脚本的特定情况下,您甚至不需要变量。我会像这样重写你的脚本:
#!/bin/bash
grep -q 'network.*Purple' generalInfo.info &&
echo "This network is Purple" ||
echo "This network is not Purple"
您不需要cat
为了grep
它而创建文件,也不需要在变量中存储某些内容来检查它是否存在。
答案2
你sed
可以试试这个:
sed 's/^.*: "\(.*\)",$/\1/' generalInfo.info
这个变体cut
:
cut -d'"' -f4 generalInfo.info
和grep
:
grep -Po '(?<=": ").*(?=",)' generalInfo.info
答案3
$ var=$(awk -F'"' '$2=="network"{print $4}' file)
$ echo "$var"
Purple