我有一个文件,其中包含必须隐藏的值(替换为 XX),但它们在整行中并不总是位于同一位置,而且我不知道它们的内容。但我知道的是它们相对于特定匹配项的位置。
例如,我想将“00 00”后的第三和第四个数字替换为XX
原来的:
AA BB CC 00 00 01 02 03 04 05 06 07
AA BB CC DD EE FF 00 00 08 09 10 11 12 13 14
期望输出:
AA BB CC 00 00 01 02 XX XX 05 06 07
AA BB CC DD EE FF 00 00 08 09 XX XX 12 13 14
我尝试使用 awk,但只能定位到行首。例如,有没有办法从特定匹配中索引 $2 和 $3?
编辑:该行中只能出现一次00 00
,它不能包含00 00 00
无需担心前导或尾随匹配。
我迄今为止的(令人尴尬的)尝试是:
cat file | awk -F'00 00' '{print $2}' | awk '{gsub ($3,"XX",$0);gsub ($4,"XX",$0)}1'
除了多个 awk 之外,我还丢失了行的开头,因为匹配项之前的所有内容都被我的第一个 awk 删除了
sed
使用或perl
比使用更容易,awk
除非您有一个awk
支持 的gawk
扩展gensub()
名:使用 POSIX
awk
,您可以执行以下操作:这是一个 awk 方法:
这个想法是遍历所有字段(
for(i=1; i<=NF; i++)
;NF
是字段数),并查找当前字段($i
)和下一个字段($(i+1)
)都设置为字符串的情况00
。然后,我们将第 3 和第 4 个字段更改为XX
($(i+4)=$(i+5)="XX"
;使用+4
和,+5
因为我从第一个 开始计算00
,而不是第二个)。最后,我们打印所有内容。当表达式求值为真时,默认操作awk
是打印该行,因此简单的1
(始终为真)通常用作 的简写print
。请注意,这样做的缺点是将字段分隔符替换为空格。在此示例中,这似乎不是问题,但如果是问题,只需指定输入和输出分隔符即可。因此,如果您的输入中有要保留的逗号,您可以执行以下操作:
您也可以将其视为一个简单的替换并执行以下操作:
或者
使用
awk
:假设之后只有数字重复
00 00
。该命令使用
gawk
的拆分功能。首先,当前记录(
$0
)为split
。此内置函数创建两个数组,即a
和seps
(分隔符数组)。然后$0
将设置为""
。然后sub()
用于var
替换数组中要替换的字段seps
。该命令通过的内置函数
awk
来拆分字段。GNU awk
split
n = 拆分(s,数组,sep)
将字符串s拆分为array[1] , ..., array[n]。返回找到的元素数。如果提供了sep参数,则将其用作字段分隔符;否则使用FS 。
来自 Awk — 一种模式扫描和处理语言
split(字符串,数组[,fieldsep [,seps]] )
将字符串分成由fieldsep分隔的片段,并将片段存储在数组中,将分隔符字符串存储在seps数组中。
摘自Arnold Robbins 所著的《有效的 AWK 编程》 。
使用任何 awk: