regex - 用 bash 匹配正则表达式,输出顺序错误
问题描述
我有需要处理的文本文件,因此它将返回所需的输出。
hostname ABC1234567
NAME: "Chassis", DESCR: "Nexus5020 Chassis"
PID: N5K-C5020P-BF , VID: V04 , SN: SSI13390FZT
NAME: "Module 1", DESCR: "40x10GE/Supervisor"
PID: N5K-C5020P-BF , VID: V04 , SN: JAF1344BHNK
NAME: "Module 2", DESCR: "6x10GE Ethernet Module"
PID: N5K-M1600 , VID: V01 , SN: JAB1228018M
NAME: "Module 3", DESCR: "8x1/2/4G FC Module"
PID: N5K-M1008 , VID: V01 , SN: JAB1231020C
我尝试使用正则表达式将值传递给 $host 变量,但根据输出失败。
#!/bin/bash
re_descr='DESCR: "([^"]+)"'
re_sn='SN: ([^[:space:]]+)'
re_host='hostname ([^"]+)'
while read -r; do
if [[ $REPLY =~ $re_descr ]]; then
descr=${BASH_REMATCH[1]}
continue
fi
if [[ $REPLY =~ $re_sn ]]; then
sn=${BASH_REMATCH[1]}
fi
if [[ $REPLY =~ $re_host ]]; then
host=${BASH_REMATCH[1]}
fi
if [[ $descr && $sn ]]; then
printf '%s\t%s\n' "$host"-"$descr","$sn"
unset -v host descr sn
fi
done < <(cat file.txt)
现在它将打印
-Nexus5020 Chassis,SSI13390FZT
-40x10GE/Supervisor,JAF1344BHNK
-6x10GE Ethernet Module,JAB1228018M
-8x1/2/4G FC Module,JAB1231020C
我怎样才能让它工作,所以它会以这种格式打印
ABC1234567-Nexus5020 Chassis,SSI13390FZT
ABC1234567-40x10GE/Supervisor,JAF1344BHNK
ABC1234567-6x10GE Ethernet Module,JAB1228018M
ABC1234567-8x1/2/4G FC Module,JAB1231020C
解决方案
这只是逻辑错误,而不是 bash 本身的问题。与以下工作代码进行比较,您可以在https://ideone.com/mLj5ia看到它的运行情况:
#!/usr/bin/env bash
re_descr='DESCR: "([^"]+)"'
re_sn='SN: ([^[:space:]]+)'
re_host='hostname ([^"]+)'
while IFS= read -r line; do line=${line%$'\r'}
[[ $line =~ $re_descr ]] && descr=${BASH_REMATCH[1]}
[[ $line =~ $re_sn ]] && sn=${BASH_REMATCH[1]}
[[ $line =~ $re_host ]] && host=${BASH_REMATCH[1]}
if [[ $descr && $sn ]]; then
printf '%s-%s,%s\n' "$host" "$descr" "$sn"
descr= sn=
fi
done
- 我们不想
continue
在 adescr
匹配之后,因为sn
可以在同一行。 - 您不想
unset host
(或以其他方式清除host
输出行之间的变量),因为您想重复使用相同的主机名定义。 - 您希望输出带有破折号和逗号,而不是制表符,所以不要在行
\t
中使用printf
;并确保%s
印记的数量与非格式字符串参数的数量相匹配。 line=${line%$'\r'}
从输入中显式删除任何尾随回车符。
推荐阅读
- javascript - @click 的样式绑定 - vue.js
- apache-spark - Spark Structured Streaming - UI 存储内存值不断增长
- pdf - 创建 PDF 时 Phantom JS 2.1.1 中的 URL 编码问题
- jenkins - 管道 DSL:动态更改构建名称
- r - 是否可以使用模型列表自动化 plot_summs?
- service-worker - 电子邮件中的 url 链接,如何打开现有的应用程序选项卡而不是在新选项卡上重新加载应用程序
- sql - 如何根据 column2 中的字符串更新 column1?
- visual-studio - 安装自定义生成文件的 CMake 语法
- c - 在哪里读取 cmd 输入,如“myapp.exe 输入”或“myapp.exe -?” (我使用cmd)
- django - 是否有一些相当于 {% url 'some-name' %} 的 router.register(...)