kornshell - 使用sed进行更换

时间:2013-09-28 02:47:24

标签: regex bash unix sed ksh

如果文本文件包含以下内容:

1 2 3 4 5 6

如何使用诸如空格之类的字符替换某个字符串(例如4)之前的所有内容?

1 2 3 4 5 6(输入)

    4 5 6   (OUTPUT)

3 个答案:

答案 0 :(得分:4)

这可能适合你(GNU sed):

sed '/4/{:a;/^ *4/!s/[^ ]/ /;ta}' file

或:

sed 's/4/\n&/;T;h;s/[^\n]/ /g;G;s/\n.*\n//' file

或:

awk '/4/{while(!/^ *4/)sub(/[^ ]/," ")}1' file

或:

awk '/4/{sub(/4/,"\n&");h=$0;gsub(/[^\n]/," ");$0=$0 h;sub(/\n.*\n/,"")}1' file

答案 1 :(得分:3)

你现在真的进入了一些神秘的sed巫术。保持简单,只需使用易读的函数名称,变量和可理解的结构将其写入awk:

$ cat file
1 2 3 4 5 6    
$ awk 'match($0,/4/){
    pre=substr($0,1,RSTART-1)
    gsub(/./," ",pre)
    print pre substr($0,RSTART)
}' file
      4 5 6

sed是一个很好的工具,可以在一行上进行简单的替换,但对于其他任何东西只需使用awk。如果你使用的不仅仅是s,g和p(使用-n)sed语言结构,那么你就得到了错误的工具。一旦awk被发明,几乎所有其他sed语言结构在1976年左右就已经过时了。

如果您在一年内回来加强此脚本以执行不同的操作,例如在现在行的末尾打印一个计数很多字符被替换为空格,你宁愿面对试图理解然后修改它:

sed 's/\(4\)/\n\1/;Tq;h;s/^[^\n]*\n//;x;s/\n.*//;s/./ /g;G;s/\n//;:q'

或上面的awk脚本?在awk脚本中进行调整只是添加和打印变量(cnt下面的内容):

awk 'match($0,/4/){
    pre=substr($0,1,RSTART-1)
    cnt=gsub(/./," ",pre)
    print pre substr($0,RSTART), cnt
}' file

为了制作sed脚本,我希望它能够需要3只山羊,血月和蝙蝠侠符号。

答案 2 :(得分:1)

$ echo -e '1 2 3 4 5 6\n7 8 9 0 1 2'|
> sed 's/4/\n&/;T;h;s/^[^\n]*\n//;x;s/\n.*//;s/./ /g;G;s/\n//'
      4 5 6
7 8 9 0 1 2
$

说明:

s/4/\n&/;T        # places "\n" marker before "4", quits otherwise
h;s/^[^\n]*\n//;x # puts "4 5 6" into hold space
s/\n.*//          # keeps only "1 2 3 "
s/./ /g           # replaces each char with space
G;s/\n//          # appends "4 5 6" from hold space