在 bash 中按空格分割的字符串中找到一个选项



我有一个这样的字符串,将其命名为选项:

"printer-is-accepting-jobs=true printer-is-shared=false printer-location=Library printer-make-and-model='HP LaserJet 600 M601 M602 M603' printer-state=3"

它们是"选项=值"格式,用空格分隔。 但是"打印机制造和模型"具有空格的价值。

已尝试命令:

for word in $Options; do echo $word; done

所有 HP LaserJet 600 M601 M602 M603 都是拆分的。

如何在 bash 命令中处理这个问题?

使用 grep -oP

grep -oP "printer-make-and-model='K[^']*" <<< "$s"
HP LaserJet 600 M601 M602 M603

或使用 sed:

sed "s/^.*printer-make-and-model='([^']*).*/1/" <<< "$s"
HP LaserJet 600 M601 M602 M603

Anubhava 的正则表达式很好,所以如果你没有grep -P选项,那么你可以试试:

ack命令:

$ ack -ho "printer-make-and-model='K[^']*" <<< "$options"
HP LaserJet 600 M601 M602 M603

Perl

$ perl -nle "print $+{f} if /printer-make-and-model='(?'f'K[^']*)/" <<< "$options"
HP LaserJet 600 M601 M602 M603

您可以使用多个 awk 语句来执行此操作:

while read record; do
    while read key value; do
        echo "K=($key) V=($value)"
    done< <(awk -F"=" '{printf("%s %sn", $1, $2)}' <<< $record)
done< <(awk -F"printer-" '{for(i=2;i<NF;i++){printf("printer-%sn", $i)}}' <<< $string)

这将拆分为输出为键值对。

由于您需要解析选项,因此可以使用getopt .但是,这需要使用邪恶eval命令。因此,请小心您的输入。

$ string="printer-is-accepting-jobs=true printer-is-shared=false printer-location=Library printer-make-and-model='HP LaserJet 600 M601 M602 M603' printer-state=3"
$ eval a=("$string")
$ eval b=($(getopt --long printer-make-and-model: -- ${a[@]/#/--} 2>/dev/null))
$ echo "${b[1]}"
HP LaserJet 600 M601 M602 M603

相关内容

  • 没有找到相关文章

最新更新