我的文件包含由起始部分定义的部分,其中包含 oy TITLE
, SUBTITLE
,后跟逗号分隔KEYWORD
。
## TITLE [SUBTITLE] KEYWORD,KEYWORD
结尾是使用完成的
## END OF TITLE [SUBTITLE]
我想确保该文件包含定义的相应结束部分。
我怎样才能进行测试来检查文件是否具有应有的内容。我需要在 bash 中进行测试。
## FAML [ASMB] keyword,keyword
## Some text
## Description
## END OF FAML [ASMB]
Some Code
## More text
## FALUN [GONG] keyword,keyword
## Some text
## Description
## END OF FALUN [GONG]
More Text
从以下开始捕获相应部分的实际字符串。
while read line; do
if [[ $line =~ ^##\ ([A-Z]+)\ \[([A-Z]+)\]\ (.*),(.*)$ ]]; then
title=${BASH_REMATCH[1]}
subtitle=${BASH_REMATCH[2]}
keywords=${BASH_REMATCH[3]}
keywords2=${BASH_REMATCH[4]}
echo "Title: $title"
echo "Subtitle: $subtitle"
echo "Keywords: $keywords, $keywords2"
fi
done < input.txt
尝试运行以下代码,但打印不是关键字,数组打印没有发生。
## DN [AMBIT] bash,resource
## hodeuiihoedu
## AVAL:
## + ooeueocu
## END OF DN [AMBIT]
答案1
要读取任意数量的关键字,请更改正则表达式以查找任何文本后跟可选逗号的模式。完整的关键字列表将被捕获到单个变量中。然后将逗号分隔的列表读入数组中。
while read -r line; do
if [[ $line =~ ^##\ ([A-Z]+)\ \[([A-Z]+)\]\ (.*[,]?)$ ]]; then
title="${BASH_REMATCH[1]}"
subtitle="${BASH_REMATCH[2]}"
echo "Title: $title"
echo "Subtitle: $subtitle"
# read keyword list into array
IFS=',' read -ra keywords <<< "${BASH_REMATCH[3]}"
i=0
for kw in "${keywords[@]}"; do
echo "Keyword$((i+=1)): $kw"
done
echo
fi
done << EOF
## FAML [ASMB] keyword1,keyword2
## Some text
## Description
## END OF FAML [ASMB]
Some Code
## More text
## FALUN [GONG] keyword1,keyword2,keyword3,keyword4
## Some text
## Description
## END OF FALUN [GONG]
EOF
输出:
Title: FAML
Subtitle: ASMB
Keyword1: keyword1
Keyword2: keyword2
Title: FALUN
Subtitle: GONG
Keyword1: keyword1
Keyword2: keyword2
Keyword3: keyword3
Keyword4: keyword4