【问题标题】:bash command to check if line has certain patternbash 命令检查行是否具有特定模式
【发布时间】:2023-01-08 10:59:08
【问题描述】:

我有一个文件,我必须在其中检查以特定模式开头的行。例如 - id: 34。我写了 bash 脚本,但它似乎没有检测到该行

#!/bin/bash

id=34

# Read the file line by line
while read line; do
  # Check if the line starts with pattern
  if [[ $line =~ ^[[:space:]]-[[:space:]]id:[[:space:]]$id ]]; then
    in_section=true
    echo "$line"
  fi

done < file.txt
 

样本文件

$cat file.txt 
apiVersion: v1
data:
  topologydata: |
    config:
      topology:
        spspan:
        - id: 1
          name: hyudcda1-
          siteids:
          - 34
        spssite:
        - id: 34
          location: PCW
          matesite: tesan

【问题讨论】:

  • 您只匹配以开头的行空白字符,而不是任意的空白序列。据推测,该行没有缩进单个制表符。
  • 为自己省去很多麻烦,并使用适当的 YAML 解析器,而不是试图用正则表达式破解一些东西。
  • 使用 yaml 解析是我的第一个想法,但请相信我,我没有那个选项
  • 正如@chepner 所说,您只匹配一个空格单元。如果你使用“*”,它将匹配零个或多个,像这样if [[ $line =~ ^[[:space:]]*-[[:space:]]*+id:[[:space:]]*+$id ]]; then

标签: bash


【解决方案1】:

你很接近,但最好使用grep

grep -E "^[[:space:]]+-[[:space:]]+id:[[:space:]]+$id" file

你应该试试 YAML 解析器:yq

【讨论】:

    猜你喜欢
    • 2020-07-10
    • 2017-09-24
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多