我有一个包含 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
步骤:
- 在开始时设置有用的变量(即仅一次);从“未标记”状态开始。
然后对于每条记录:
- 如果第一个字段是结束标记,则转到“未标记”状态。
- 如果在“标记”状态下满足条件,则执行该工作。
- 如果第一个字段是开始标记,则转到“标记”状态。
- 打印整个记录。
请注意,该过程首先检查结束标记,然后执行作业,最后检查开始标记。关键是它不应该操纵标记线。在您的示例中,条件 ( ZDMAD
) 不能匹配任何标记线,因此不同的序列不会有问题;但一般来说,您应该考虑到这一点。