下面的代码片段给出了以下错误
sed: -e expression #1, char 45: unterminated address regex
当行号迭代时:
for line in `seq 1 3 265`; do
sed -i '${line}s/foo/bar/' $FILE
done
有人知道如何解决这个问题吗?
当前代码的几个问题:
sed
脚本必须使用双引号,以便bash
变量展开- 不需要转义字符(
)…在这种情况下
对OP当前代码的一些小更改:
for line in `seq 1 3 265`; do
sed -i "${line} s/foo/bar/" $FILE
done
一个awk
想法,需要通过一次输入文件:
awk '
BEGIN { for (i=1;i<=265;i=i+3) seq[i] }
FNR in seq { $0=gensub(/foo/,"bar",1) }
1' $FILE
如果使用GNU awk
,并且对这段代码的结果感到满意,请将awk '...
替换为awk -i inplace '...
,以便于更新源文件。
这可能适合您(GNU sed):
sed -i '1~3s/foo/bar;265{:a;n;ba}' file
从第1行开始,此后每隔3行直到第265行,将foo
替换为bar
。
或:
sed -i '256,$b;1~3s/foo/bar/' file
你可以seq 1 3 265
skip-count事情没有任何modulo %
数学:
jot -w '%d=foobar=barfool=' 265 | {m,g}awk 'BEGIN { __ =_^= FS = "^$" __+=_+_ } NR !=_ || -sub("foo","bar")<(_+=(_<265)*__)'
1=
barbar
=barfool=
2=foobar=barfool=
3=foobar=barfool=
4=
barbar
=barfool=
5=foobar=barfool=
6=foobar=barfool=
7=
barbar
=barfool=
8=foobar=barfool=
9=foobar=barfool=
.
.
.`