如何使用此命令:
perl -pi -e 's/[^[:ascii:]]/#/g' file
Run Code Online (Sandbox Code Playgroud)
只更改偏移A处的字符到每行的偏移量B?
在保留下我没有正确理解你的问题,如果偏移A和B是5和10,那么它应该是这样的:
perl -pi -e 's/(?<=.{5})(?<!.{10})[^[:ascii:]]/#/g' file
Run Code Online (Sandbox Code Playgroud)
说明:
[^[:ascii:]] <- the character which is looked for
(?<=.{5}) <- if at least 5 chars were before (offset 5)
(?<!.{10}) <- but no more than 10 characters before (offset 10)
Run Code Online (Sandbox Code Playgroud)
结构:
(?<= ...) and (?<! ...)
Run Code Online (Sandbox Code Playgroud)
被称为正面和负面的外观,与断言是零.(你可以在google他们,见环视断言在perlre)
substr()在标题中提到过,我首先忽略了这一点.当然,这也会起作用:
perl -pi -e 'substr($_,5,10)=~s/[^[:ascii:]]/#/g' file
Run Code Online (Sandbox Code Playgroud)
substr EXPR,OFFSET,LENGTH可以在perldoc中找到描述.这个例子很好地说明了使用substr()左值.
问候
RBO
除了橡胶靴的答案,您可以操作子字符串而不是整个字符串开头:
perl -pi -e 'substr($_, 5, 5) =~ s/[^[:ascii:]]/#/g' file
Run Code Online (Sandbox Code Playgroud)
为了显示:
perl -e 'print "\xff" x 16' | \
perl -p -e 'substr($_, 5, 5) =~ s/[^[:ascii:]]/#/g' | \
hd
Run Code Online (Sandbox Code Playgroud)
将打印
ff ff ff ff ff 23 23 23 23 23 ff ff ff ff ff ff
Run Code Online (Sandbox Code Playgroud)
在此代码中,第一个偏移量是基于0的,您必须使用长度而不是第二个偏移量,因此它将是
substr($_, A-1, B-A).