linux - 从 1 行获取带有 awk 的字符串/短语
问题描述
我们正在使用一个脚本,它返回结果如下
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header/><env:Body><consultaDeudaResponse xmlns="http://www.example.org/webServicesvc-schema-services"><estado>120007</estado><mensaje>CONSULTA DE DEUDA CORRECTA.</mensaje><deudas><deuda><N>0</nisRad><secNis>1</secNis><nombre>TEST</nombre></env:Envelope>
我试图从 awk 中得到CONSULTA DE DEUDA CORRECTA的短语,因为您可以看到所有内容都在一行中,没有空格或逗号。所以我不知道如何获取该短语并将其设置为变量。
我用了
const=$(awk '/CONSULTA DE DEUDA CORRECTA/ ' output)
和
const=$(awk '/^CONSULTA DE DEUDA CORRECTA/ ' output)
但要么整个短语与我不需要的其余信息一起出现,要么变量为空。
任何帮助表示赞赏。
解决方案
由于这是对单个字符串的简单替换,因此它比 awk 脚本更适合 sed 脚本:
$ sed -n 's:.*<mensaje>\(.*\)</mensaje>.*:\1:p' file
CONSULTA DE DEUDA CORRECTA.
$ const=$(sed -n 's:.*<mensaje>\(.*\)</mensaje>.*:\1:p' file)
$ echo "$const"
CONSULTA DE DEUDA CORRECTA.
如果你真的想使用 awk,那么使用 GNU awk 来匹配第三个参数:
$ awk 'match($0,"<mensaje>(.*)</mensaje>",a){print a[1]}' file
CONSULTA DE DEUDA CORRECTA.
推荐阅读
- javascript - 如果他们不在同一天,如何处理两个不同的时间?
- encryption - 无人值守/自动化 Linux 设备密钥管理(用于访问更新服务器的证书)
- reactjs - 无法从 reactjs 响应中的 asp.net 核心控制器端点获取响应
- vba - 如何检测简单 vba 字符串替换中的编号
- python - 如何使用 Matplotlib 将 X 轴设置为时间轴
- javascript - 如何使用 JS 更改列表项的结构以解决 inline-block 在它们之间生成的空间
- php - 使用 php json 未在表上显示 Json 数据
- dynamic-linking - 如何在 OpenFOAM 中编译 OpenVINO-Code?
- c - C中的线程同步:为什么它们重叠
- android - 我应该重构 mvp android 中的单元测试代码吗?