sed增量号

时间:2010-12-16 16:25:53

标签: variables sed increment

我想用增量值替换一些文本。 考虑文件xx:

<outro>dfdfd</outro>
<RecordID>1</RecordID>
<outro>dfdfd</outro>
<RecordID>1</RecordID>
<outro>dfdfd</outro>
<RecordID>1</RecordID>
<outro>dfdfd</outro>

和sed命令:

for n in seq 3;do sed -e 's/<RecordID>\d/<RecordID>'`echo $n`'/' xx; done

echo $n命令不会增加。

也试过:

n=1; sed -e 's/<RecordID>/<RecordID>'`echo $n ;let n=$n+1`'/g' xx

但没有成功。

仅考虑sed(没有awk或perl)如何将RecordID字段递增,如:

<outro>dfdfd</outro>
<RecordID>1</RecordID>
<outro>dfdfd</outro>
<RecordID>2</RecordID>
<outro>dfdfd</outro>
<RecordID>3</RecordID>
<outro>dfdfd</outro>

4 个答案:

答案 0 :(得分:6)

while read line; do n=$((++n)) &&  echo $line|sed -e 's/[0-9]/'$(($n))'/' ; done < patt

答案 1 :(得分:4)

尽管问题中的陈述不能使用Perl和Awk,但到目前为止给出的答案表明sed不是执行此任务的正确工具。我看到的答案都只适用于极其有限的数据集,只能在非常小的数据集上工作。

使用sed,没有一种合理的方法可以处理数千条记录。你可以一起破解解决方案,如果你小心,处理三个记录ID(提示:在映射2到3之前你可能需要映射3到4,以免映射的3重新映射到4)。

使用Perl或Python,它是可行的。

perl -e 's{<RecordID>(\d+)</RecordID>}{$n=$n+1; "<RecordID>$n</RecordID>"}e'

这是“使用正确的工具”的案例。 sed是一个很好的工具,适用于它所设计的工作(以及很多未设计的工作)。然而,这对它过分强调。

答案 2 :(得分:3)

首先,sed无法理解\d。请改用[0-9][[:digit:]]

其次,for n in seq 3会将n设置为“seq”和“3”。使用for n in $(seq 3)或(在Bash中)使用for n in {1..3}

第三,您需要保存更换的结果。如果您的sed版本支持-i(就地),则可以使用该版本,或者您可能需要使用sed ... xx > xx.tmp && mv xx.tmp xx

第四,您需要选择要进行更改的行。

将所有这些放在一起,这可行,但可能会很慢:

for n in $(seq 3); do sed -e $(($n*2))'s/<RecordID>[[:digit:]]/<RecordID>'$n'/' xx > xx.tmp && mv xx.tmp xx; done

答案 3 :(得分:1)

使用sed执行此操作的真正方法当然是不需要在shell中进行循环。使用像丹尼斯这样的东西。地址匹配器缩小范围,然后使用script in sed's info pages中的表达式。它在词法上增加数字,不涉及算术。它唯一的技巧是照顾携带物。