SED替换行号图案(Sed replace pattern with line number)

2019-07-31 17:09发布

我需要更换图案###与当前的行号。

我设法与两个AWK和SED下一行打印。

sed -n "/###/{p;=;}" file打印到下一行,而p; ,它取代了整条生产线。

sed -e "s/###/{=;}/g" file用来制作感在我的头,由于=; 返回匹配模式的行数,但它会返回我的文字{=;}

我在想什么? 我知道这是一个愚蠢的问题。 我找不到这个问题的答案sed的手册中,这不是很清楚。

如果可能的话,指出我什么我失踪,以及如何使其发挥作用。 谢谢

Answer 1:

简单的awk oneLiner:

awk '{gsub("###",NR,$0);print}'


Answer 2:

鉴于该局限性=命令 ,我觉得它更容易在两(实际上,三)部分来划分工作。 随着GNU sed ,你可以这样做:

$ sed -n '/###/=' test > lineno

然后像

$ sed -e '/###/R lineno' test | sed '/###/{:r;N;s/###\([^\n]*\n\)\([^\n]*\)/\2\1/;tr;:c;s/\n\n/\n/;tc}'

恐怕有没有简单的方法sed因为,还有=命令时, r和GNU扩展R命令不会读取文件到模式空间,而是直接追加线路输出,所以内容该文件不能以任何方式修改。 因此输送至另一个sed命令。

如果内容test

fooo
bar ### aa
test
zz ### bar

以上会产生

fooo
bar 2 aa
test
zz 4 bar


Answer 3:

这可能会为你工作(GNU SED):

sed = file | sed 'N;:a;s/\(\(.*\)\n.*\)###/\1\2/;ta;s/.*\n//'


Answer 4:

正如列夫Levitsky注意到这是不可能用的sed的一个调用,因为行号被直接发送到标准输出。

你本可以用sed写一个sed脚本适合你,做更换两遍:

INFILE

a
b
c
d
e
###
###
###
a
b
###
c
d
e
###

查找包含图案线条:

sed -n '/###/=' infile

输出:

6
7
8
11
15

管道将进入一个sed脚本编写一个新的sed脚本:

sed 's:.*:&s/###/&/:'

输出:

6s/###/6/
7s/###/7/
8s/###/8/
11s/###/11/
15s/###/15/

执行:

sed -n '/###/=' infile | sed 's:.*:&s/^/& \&/:' | sed -f - infile

输出:

a
b
c
d
e
6
7
8
a
b
11
c
d
e
15


Answer 5:

这个可以吗 ?

kent$  echo "a
b
c
d
e"|awk '/d/{$0=$0" "NR}1'
a
b
c
d 4
e

如果匹配模式“d”,在该行的末尾附加行号。

编辑

哦,你要替换的模式不追加行号......看看新的CMD:

kent$  echo "a
b
c
d
e"|awk '/d/{gsub(/d/,NR)}1'
a
b
c
4
e

和线可以被写成这样,以及: awk '1+gsub(/d/,NR)' file



Answer 6:

单行修改置入的文件,与对应的行号替换LINE:

seq 1 `wc -l FILE | awk '{print $1}'` | xargs -IX sed -i 'X s/LINE/X/' FILE


文章来源: Sed replace pattern with line number
标签: sed awk gawk