我需要更换图案###
与当前的行号。
我设法与两个AWK和SED下一行打印。
sed -n "/###/{p;=;}" file
打印到下一行,而p;
,它取代了整条生产线。
sed -e "s/###/{=;}/g" file
用来制作感在我的头,由于=;
返回匹配模式的行数,但它会返回我的文字{=;}
我在想什么? 我知道这是一个愚蠢的问题。 我找不到这个问题的答案sed的手册中,这不是很清楚。
如果可能的话,指出我什么我失踪,以及如何使其发挥作用。 谢谢
简单的awk
oneLiner:
awk '{gsub("###",NR,$0);print}'
鉴于该局限性=
命令 ,我觉得它更容易在两(实际上,三)部分来划分工作。 随着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
这可能会为你工作(GNU SED):
sed = file | sed 'N;:a;s/\(\(.*\)\n.*\)###/\1\2/;ta;s/.*\n//'
正如列夫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
这个可以吗 ?
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
单行修改置入的文件,与对应的行号替换LINE:
seq 1 `wc -l FILE | awk '{print $1}'` | xargs -IX sed -i 'X s/LINE/X/' FILE