通过匹配键/值对来删除bash中面向块的文件的一部分

时间:2017-11-29 00:42:07

标签: bash sh

我根据一个给定的值(相关人员的姓名),在我的文件中删除了3行以来的方式。 我设法删除了我的文件的最后几行,但没有在值之后随机删除行。你能救我吗?

test.txt - 之前:

Name : Mike
Surname : Tilmen
-----------------------------------
Name : Mould
Surname : Told
-----------------------------------
Name : May
Surname : Dery
-----------------------------------

test.txt - 名称为“模具”(不工作)之后:

Name : Mike
Surname : Tilmen
-----------------------------------
Name : May
Surname : Dery
-----------------------------------

2 个答案:

答案 0 :(得分:0)

一般惯例

  • BashFAQ #1描述了将内容逐行读入bash。
  • The Conditional Expression关于bash-hackers' wiki描述了[[ ]]构造,它可用于对bash中字符串的属性进行各种测试(包括将它们与正则表达式进行比较或执行子字符串检查)。

将其用于

如果您编写了如下脚本:

#!/usr/bin/env bash

key_to_delete=$1
value_to_delete=$2

sep_re='^-+[[:space:]]*$'
block=''
matched=0
while IFS= read -r line; do
  if [[ $line =~ $sep_re ]]; then
    if (( matched == 0 )); then
      [[ $block ]] && printf '%s%s\n' "$block" "$line"
    fi
    block=''
    matched=0
  else
    if [[ $line =~ ^"${key_to_delete}"[[:space:]]+:[[:space:]]+"${value_to_delete}"[[:space:]]*$ ]]; then
      matched=1
    fi
    block+="$line"$'\n'
  fi
done

...并且,将该脚本保存为remove_kv,运行:

remove_kv Name Mould <in.txt >out.txt

...然后你的out.txt将删除名称为Mold的条目。

答案 1 :(得分:0)

你可以这样使用gawk

$ awk 'BEGIN{RS="\n-[-]+\n"} 
      /\<Mould\>/{next} 
      {printf "%s\n-----------------------------------\n", $0}' file

打印:

Name : Mike
Surname : Tilmen
-----------------------------------
Name : May
Surname : Dery
-----------------------------------