插入中的N插入

时间:2010-02-18 19:58:43

标签: regex insert replace sed

如何使用sed用空格替换每行的前150个字符。我不想带出大枪(Python,Perl等),看起来sed本身就非常强大(有些人已经在其中编写了直流计算器)。一个相关的问题是在每行前面插入150个空格。

s/^.\{50\}/?????/

匹配前50个字符,但接着是什么?我不能做输出

s/^.\{50\}/ \{50\}/

可以使用readline来模拟150个印刷机(alt + 150,)但这很蹩脚。

4 个答案:

答案 0 :(得分:2)

基本上你想要这样做:

sed -r "s/^.{150}/$(giveme150spaces)/"

问题是以编程方式获得150个空格的最优雅方式是什么。这里讨论了各种技术:Bash Hacker's Wiki。最简单的方法是使用printf '%150s',如下所示:

sed -r "s/^.{150}/$(printf '%150s')/"

答案 1 :(得分:2)

使用保留空间。

/^.\{150\}/ {;# simply echo lines shorter than 150 chars
    h;# make a backup
    s/^.\{150\}\(.*\)/\1/;# strip 150 characters
    x;# swap backup in and remainder out
    s/^\(.\{150\}\).*/\1/;# only keep 150 characters
    s/./ /g;# replace every character with a space
    G;# append newline + remainder to spaces
    s/\n//;# strip pesky newline
};

或者,您可以编写循环代码(稍微更短的代码):

s/^.\{150\}/x/;# strip 150 characters & mark beginning of line
t l
# if first substitution matched, then loop
d; # else abort and go to next input line
:l
# begin loop
s/^/ /;# insert a space
/^ \{150\}x/!t l
# if line doesn't begin with 150 spaces, loop
s/x//;# strip beginning marker

但是,我不认为你可以使用没有sed -f的循环,或找到其他方法来逃避换行。标签名称似乎运行到行尾,直到;

答案 2 :(得分:1)

逻辑是迭代文件,打印150个空格,然后使用“substringing”打印从151到最后的剩余行。例如前10个字符。

$ more file
1234567890abc
0987654321def
$ awk '{printf "%10s%s\n", " ",substr($0,11)}' file
          abc
          def

这比制作正则表达式简单得多。

击:

while read -r line
do
    printf "%10s%s\n" " " "${line:10}"
done <"file"

答案 3 :(得分:1)

这可能对您有用:

sed ':a;/^ \{150\}/!{s/[^ ]/ /;ta}' file

这将用空格替换行的前150个字符。但是,如果线条短于150,则用空格替换所有线条,但保留原始长度。

此解决方案用空格替换前150个字符或将行增加到150个空格:

sed ':a;/^ \{150\}/!{s/[^ ]/ /;ta;s/^/ /;ba}' file

这会替换带有空格的行的前150个字符,但不会触及更短的行:

sed '/.\{150\}/!b:a;/^ \{150\}/!{s/[^ ]/ /;ta}' file