7.6 行内の文字の逆順化

このスクリプトは、行内の文字の並びを逆にするために使えます。1度に2文字を移動する手法なので、より直感的な実装よりも高速です。

ラベル定義の前にあるtxコマンドに注目してください。tコマンドが検査するフラグをリセットするため、この処理が必要になることがよくあります。

想像力のある読者なら、このスクリプトの用途を思いつくでしょう。たとえば、bannerの出力を逆にする用途があります。10

#!/usr/bin/sed -f

/../! b

# Reverse a line.  Begin embedding the line between two newlines
s/^.*$/\
&\
/
コード内の説明(日本語訳)

行を逆順にします。まず、行を2つの改行で挟みます。


# Move first character at the end.  The regexp matches until
# there are zero or one characters between the markers
tx
:x
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/
tx
コード内の説明(日本語訳)

先頭の文字を末尾へ移動します。この正規表現は、目印の間の文字が0文字または1文字になるまでマッチします。


# Remove the newline markers
s/\n//g
コード内の説明(日本語訳)

目印に使った改行を取り除きます。


(10)

これには、bannerの出力を空白で埋める別のスクリプトが必要です。たとえば、次のようにします。

#! /bin/sh

banner -w $1 $2 $3 $4 |
  sed -e :a -e '/^.\{0,'$1'\}$/ { s/$/ /; ba; }' |
  ~/sedscripts/reverseline.sed