如何遍历某些行以匹配GNU sed?



下面的代码片段给出了以下错误

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 265skip-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=
.
.
.`

最新更新