我想用增量值替换一些文本。 考虑文件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>
答案 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中的表达式。它在词法上增加数字,不涉及算术。它唯一的技巧是照顾携带物。