
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
。
- b) 正規表現が成功すると、次に位置が 19 未満かどうかがチェックされます。それ以外の場合は、
- a)
結果
1 2 3
123456789012345678901234567890
good math234
how are you math123
1234567890
good math234
try this math500
math101 is enough math