如果文本文件包含以下内容:
1 2 3 4 5 6
如何使用诸如空格之类的字符替换某个字符串(例如4)之前的所有内容?
1 2 3 4 5 6(输入)
4 5 6 (OUTPUT)
答案 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