trの-sオプションを利用すると、「連続するN文字を1文字にすること」が可能です
例を見てみます
基本的な使い方
$ echo pieeeeeen pieeeeeen # tr -s "変換を行いたい文字" $ echo pieeeeeen | tr -s e pien
無駄に多い改行を削除
また次の例では、入れすぎた改行を削除することを行なっています。
# 無駄な改行が多い $ echo -e "pi\n\n\n\n\nen" pi en # 連続する改行を1つにまとめる $ echo -e "pi\n\n\n\n\nen" | tr -s "\n" pi en
アルファベット以外で連続するものは削除
tr でアルファベット一般を表すには、[:alpha:]とします。
$ echo -e "my\n\n\n\nknee" | tr -s "[:alpha:]" my kne
これだとアルファベットのみが対象になってしまうので、アルファベット以外を表すために、-cオプション(complement set:補集合)をつけてあげます
$ echo -e "my\n\n\n\nknee" | tr -sc "[:alpha:]" my knee
今回アルファベット一般を表すために[:alpha:]という表現を用いましたが、そのほかの文字クラスについては以下を参考にしてください。
$ man tr
...
[:class:] Represents all characters belonging to
the defined character class. Class names are:
alnum <alphanumeric characters>
alpha <alphabetic characters>
blank <whitespace characters>
cntrl <control characters>
digit <numeric characters>
graph <graphic characters>
ideogram <ideographic characters>
lower <lower-case alphabetic characters>
phonogram <phonographic characters>
print <printable characters>
punct <punctuation characters>
rune <valid characters>
space <space characters>
special <special characters>
upper <upper-case characters>
xdigit <hexadecimal characters>
...
たとえば、大文字を小文字に変換するには以下のようにします
$ echo pien | tr "[:lower:]" "[:upper:]" PIEN # この方法でも可能 $ echo pien | tr "[a-z]" "[A-Z]" PIEN # こっちの方が拡張性は高い $ echo pien | tr "[a-e]" "[A-E]" piEn
他にも参考になりそうな部分は多いので、[:class:]の部分は一度眺めておくといいかもしれません。
マニュアルページ
-sオプションの部分は一応読んでおきます
$ man tr
...
-s Squeeze multiple occurrences of the characters
listed in the last operand (either string1 or string2)
in the input into a single instance of the character.
This occurs after all deletion and translation is completed.
...