如何使用 sed (使用正则表达式)将指定字符串(从数学开始)移动到特定位置(第 20 列)?我想将每行中以 math 开头的字符串移动到第 20 列,并且数学字符串始终位于该行的最后一个单词中。
how are you math123
good math234
try this math500
答案1
如果你真的必须使用sed
,那么一个可能的算法是在字符串前面添加空格,math
只要前面有 18 个或更少的字符:
$ sed -e :a -e 's/\(^.\{,18\}\)math/\1 math/; ta' file
how are you math123
good math234
try this math500
如果您只想移动最后一次出现的字符串,则可以将其锚定到行尾。例如,给定类似的东西
$ cat file
how are you math123
good math234
try this math500
math101 is enough math
然后前提是没有尾随空格
$ sed -e :a -e 's/^\(.\{,18\}\)\(math[^[:space:]]*\)$/\1 \2/; ta' file
how are you math123
good math234
try this math500
math101 is enough math
如果您sed
有扩展的正则表达式模式,您可以简化为
sed -E -e :a -e 's/^(.{,18})(math[^[:space:]]*)$/\1 \2/; ta'
答案2
虽然 sed 不擅长数学,但 awk 擅长数学:
$ awk -Fmath '{printf "%-20smath%s\n",$1,$2}' file
how are you math123
good math234
try this math500
此代码可能无法正确处理可能的极端情况,但它可以帮助您入门。
答案3
perl -pe 's/(?=math)/" " x (19-length($`))/e' yourfile
perl -pe 's// / while /.*\K(?=math)/g && 19 > pos' yourfile
在职的
- Perl 选项
-p
将设置一个隐式文件逐行循环读取。当前记录(又名行)存储在$_
变量中。 - 该
while
循环正在执行以下操作:- a)
/.*\K(?=math)/g
在当前行上操作,$_
查找regex
位置,站在哪里,右边可以是字符串“math”,左边可以是任何东西。- b) 正则表达式成功后,接下来检查位置是否小于 19。否则,跳出循环
while
。 - c) 循环体在循环操作语句
while
中确定的位置添加一个空格while
。
- b) 正则表达式成功后,接下来检查位置是否小于 19。否则,跳出循环
- a)
结果
1 2 3
123456789012345678901234567890
good math234
how are you math123
1234567890
good math234
try this math500
math101 is enough math