Regex Sed中的N-插入

Regex Sed中的N-插入,regex,insert,replace,sed,Regex,Insert,Replace,Sed,如何使用sed将每行的前150个字符替换为空格。我不想说大炮(Python、Perl等),而且sed本身似乎非常强大(例如,有些人在其中编写了dc计算器)。一个相关的问题是在每行前面插入150个空格 s/^.\{50\}/?????/ 与前50个字符匹配,然后呢?我不能做输出 s/^.\{50\}/ \{50\}/ 可以使用readline模拟150次按压(alt+150,),但这太差劲了。基本上您希望这样做: sed -r "s/^.{150}/$(giveme150spaces)/"

如何使用sed将每行的前150个字符替换为空格。我不想说大炮(Python、Perl等),而且sed本身似乎非常强大(例如,有些人在其中编写了dc计算器)。一个相关的问题是在每行前面插入150个空格

s/^.\{50\}/?????/
与前50个字符匹配,然后呢?我不能做输出

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

可以使用readline模拟150次按压(alt+150,),但这太差劲了。

基本上您希望这样做:

sed -r "s/^.{150}/$(giveme150spaces)/"
问题是通过编程获得150个空间的最优雅方式是什么。这里讨论了各种技术:。最简单的方法是使用
printf“%150s”
,如下所示:

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

基本上,您希望这样做:

sed -r "s/^.{150}/$(giveme150spaces)/"
问题是通过编程获得150个空间的最优雅方式是什么。这里讨论了各种技术:。最简单的方法是使用
printf“%150s”
,如下所示:

sed -r "s/^.{150}/$(printf '%150s')/"
使用等待空间

/^.\{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
};
或者,您可以编写一个循环(代码略短):

但是,我认为如果没有
sed-f
,或者没有其他方法来避开换行符,就不能使用循环。标签名称似乎一直延伸到行的末尾,正好穿过

使用保留空间

/^.\{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
};
或者,您可以编写一个循环(代码略短):


但是,我认为如果没有
sed-f
,或者没有其他方法来避开换行符,就不能使用循环。标签名称似乎一直延伸到行的末尾,正好穿过

逻辑是迭代文件,打印150个空格,然后使用“子字符串”打印从151到结尾的行的其余部分。如前10个字符

$ more file
1234567890abc
0987654321def
$ awk '{printf "%10s%s\n", " ",substr($0,11)}' file
          abc
          def
这比制作正则表达式要简单得多

狂欢节:

读取时-r行
做
printf“%10s%s\n”“”“${line:10}

done逻辑是迭代文件,打印150个空格,然后使用“substring”打印从151到结尾的行的其余部分。如前10个字符

$ more file
1234567890abc
0987654321def
$ awk '{printf "%10s%s\n", " ",substr($0,11)}' file
          abc
          def
这比制作正则表达式要简单得多

狂欢节:

读取时-r行
做
printf“%10s%s\n”“”“${line:10}

完成这可能适合您:

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

这可能适合您:

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

printf解决方案可以应用于OP使用sed的解决方案请求吗?printf解决方案可以应用于OP使用sed的解决方案请求吗?如上所述,并进行一些更正:
sed-n'/^.{150\}/{h;s/^.{150\}(.\\\)/\1/\x;s/^(.{150\\\\\\}./\1/\s///g;g;s/\n//p}“
原始版本将行的两部分打印在单独的行上(换句话说,添加了一个额外的换行符,第一组大括号上缺少反斜杠,并且不包括必要的“-n”无论如何,@Elite,@Dennis:很抱歉让你们工作,显然我在几个人读了答案vP-几秒钟后就发布了我的更正,看起来我的更正与您的代码相同,Dennis,在短线上给出或接受行为。@levis:例如?其他答案都使用其他工具。@Pot.sed使用正则表达式和l表示特定操作的字母字符很少。虽然代码可能很简洁,并且符合您的要求,但太多的字符加上正则表达式,使得代码不容易阅读和理解。@levis:所以您否决了我,因为当我解决一个难题时,它看起来很难看?不管是否存在更漂亮的解决方案?如上所述,有一些更正:
sed-n'/^.{150\}/{h;s/^.{150\}(.*\/\1/;x;s/^(.\{150\})./\1/;s///g;g;s/\n/;p}
原始文件在单独的行上打印行的两部分(换句话说,添加了一个额外的换行符,在第一组大括号上缺少反斜杠,并且不包含必要的“-n”无论如何,@Elite,@Dennis:很抱歉让你们工作,显然我在几个人读了答案vP-几秒钟后就发布了我的更正,看起来我的更正与您的代码相同,Dennis,在短线上给出或接受行为。@levis:例如?其他答案都使用其他工具。@Pot.sed使用正则表达式和l表示特定操作的字母字符很少。虽然代码可能很简洁,并且符合您的要求,但是太多的代码,再加上正则表达式,使得代码不容易阅读和理解。@levis:所以您否决了我,因为当我解决一个难题时,它看起来很难看?不管是否存在更漂亮的解决方案?