使用sed将指定字符串移动到指定位置

使用sed将指定字符串移动到指定位置

如何使用 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

结果

         1         2         3
123456789012345678901234567890
good               math234
how are you        math123
1234567890
good               math234
try this           math500
math101 is enough  math

相关内容