如何使用sed用空格替换每行的前150个字符。我不想带出大枪(Python,Perl等),看起来sed本身就非常强大(有些人已经在其中编写了直流计算器)。一个相关的问题是在每行前面插入150个空格。
s/^.\{50\}/?????/
匹配前50个字符,但接着是什么?我不能做输出
s/^.\{50\}/ \{50\}/
可以使用readline来模拟150个印刷机(alt + 150,)但这很蹩脚。
答案 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