sedを使用して指定された文字列を特定の位置に移動します

sedを使用して指定された文字列を特定の位置に移動します

sed (正規表現を使用) を使用して、指定された文字列 (math で始まる) を特定の位置 (20 列目) に移動するにはどうすればよいでしょうか。math で始まる文字列をすべての行の 20 列目に移動し、math 文字列が常に行の最後の単語にあるようにしたいです。

how are you math123 
good math234
try this math500 

答え1

もし本当にしなければならないを使用する場合、可能なアルゴリズムは、先行する文字が 18 文字以下である限り、sed文字列の前にスペースを追加し続けることです。math

$ 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現在の行を操作し、その右側に文字列「math」があり、左側に何かがある位置を探します $_regex
      • 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

関連情報