Bash 修改标记行之间的文本

Bash 修改标记行之间的文本

我有一个包含 8000 多行的文件。文件分为多个部分,每个部分都标有 ##C、##T、##N 等文本。我必须修改文件中的某些行。我使用命令 SED 在这些标记之间标记行。我是 Bash 新手,因此希望得到一些帮助。我必须修改这些标记之间的文本

##C
##A - beginning marker (must be next row after ##C)
text lines, some of them I have to modify
text lines, some of them I have to modify
##B -end marker

到目前为止,我有这个命令来标记标记之间的线

sed -e '/##A/,/##B/{}' file.txt

行格式如下:

ZDMAD BELCH 0 0 25 26 30 50

我的目标是更改特定行中的某些列。例如:当第一列为 ZDMAD 时,将第三列更改为 15。

我用了这个已解决的问题为我取得最大进步

答案1

由于您知道如何sed仅在标记之间进行操作,因此您的真正问题是您还不能使其“更改某些列”。这可能很棘手,因为sed不知道列。

例如:当第一列是 ZDMAD 时,将第三列更改为 15。

也许这个特定的例子可以在中解决sed,但在一般情况下,操作列awk会更好,因为它将记录分成字段并在这个抽象级别上操作。

这在我的 Debian 中有效:

awk '
BEGIN {
   marked=0
   markA="##A"
   markZ="##B"
}
$1==markZ {marked=0}
$1=="ZDMAD" && marked==1 {$3=15}
$1==markA {marked=1}
{print $0}
' file.txt

步骤:

  1. 在开始时设置有用的变量(即仅一次);从“未标记”状态开始。

然后对于每条记录:

  1. 如果第一个字段是结束标记,则转到“未标记”状态。
  2. 如果在“标记”状态下满足条件,则执行该工作。
  3. 如果第一个字段是开始标记,则转到“标记”状态。
  4. 打印整个记录。

请注意,该过程首先检查结束标记,然后执行作业,最后检查开始标记。关键是它不应该操纵标记线。在您的示例中,条件 ( ZDMAD) 不能匹配任何标记线,因此不同的序列不会有问题;但一般来说,您应该考虑到这一点。

相关内容