【发布时间】:2021-01-06 12:49:17
【问题描述】:
我的文本文件看起来像
abc d="cde"
abc d="cde"
abc d="cde"
abc d="cde"
something abc d="cde"
something abc d="cde"
d="123"
d="123"
我与awk 有一个循环
awk '{for(i=1;i<=NF;i++){if($i~/d=/){sub(/d=".*"/,"d=\""++count"\"",$i)}}} 1;' inputFile
它给了
abc d="1"
abc d="2"
abc d="3"
abc d="4"
something abc d="5"
something abc d="6"
d="7"
d="8"
但我只想更改abc d=。所以我将代码更新为
awk '{for(i=1;i<=NF;i++){if($i~/abc d=/){sub(/abc d=".*"/,"abc d=\""++count"\"",$i)}}} 1;'
或
awk '{for(i=1;i<=NF;i++){if($i~/abc[[:space:]]d=/){sub(/abc[[:space:]]d=".*"/,"abc d=\""++count"\"",$i)}}} 1;'
以上都不起作用。我期望的输出是
abc d="1"
abc d="2"
abc d="3"
abc d="4"
something abc d="5"
something abc d="6"
d="123"
d="123"
所以问题是如何正确包含space? abc[[:space:]]d 或 abc d 或 abc[[:blank:]]d?我累了他们所有人,但没有工作。
【问题讨论】:
-
如果你测试你的最后两次尝试,你会看到没有任何东西被替换,这是因为没有字段匹配该模式。一个字段是
abc,另一个是d=,但不存在abc d=字段。请参阅下面的答案了解如何在此处使用sub。 -
如果
abc d=之前没有双引号,那么只需awk 'BEGIN{FS=OFS="\""}$1~/abc d=$/{$2=++n}1' file -
@jxc 在这个问题中,
abc和d=可以存在于各种字段位置,例如1和2,或者2和3,最好不要拆分到字段。 -
与你的样本数据,当你使用
"作为FS来分割行时,如果abc d=之前没有任何其他",则该数字将始终位于$2而abc d=在$1的末尾? -
@jxc 好主意,但
$1~/abc也匹配应该排除的情况,例如abc some text d="x"。加上你提到的,关于可能在以前的职位上的"。最好单独使用sub,不要拆分字段,因为问题要求匹配abc d=。