1. 概要

このチュートリアルでは、GNU / Linuxが提供するツールを使用して、行の最初のn文字を削除する方法を学習します。

2. cutを使用する

cut を使用すると、行の特定のセクションを長さまたは区切り文字のいずれかで選択できます。

これらの最初の文字を使用して、文字列の最初の3文字を削除してみましょう。 4番目の文字まで削除するように指示します。

$ echo '123456789' | cut -c 4-
456789

3. sedを使用する

削除する文字の数には限りがあることがわかっているので、パターンがあります。 sed を使用すると、多くの場合、パターンを使用してテキストをフィルタリングおよび変換できます。

正規表現を使用して、最初の3文字を検索し、sedで行から削除することができます。

$ echo '123456789' | sed -r 's/^.{3}//'
#                             |____||____ sed removes them
#                                |                
#                                |__ search for the first three characters

パラメータ-r、を使用すると、拡張正規表現を使用できるようになります。

4. grepを使用する

sedと同様に、grepもテキストパターンを使用して動作します。 同じ正規表現を使用して、最初の3文字を探します。

$ echo '123456789' | grep -Po '^.{3}\K.*'

-Po フラグは、パターンをPerl互換の正規表現として解釈するようにgrepに指示します。

\ K エスケープシーケンスにより、以前に一致したもの(最初の3文字)が最後に含まれなくなり、。*は後続のすべてに一致します。

grep のその他の使用例と例は、一般的なLinuxテキスト検索にあります。

5. awkを使用する

awk を使用すると、特定のパターンにアクションを適用できます。

正規表現を思い出して、 awk スクリプトで、 sub 関数の引数として使用して、目的の文字を削除できます。

$ echo '123456789' | awk 'sub(/^.{3}/,"")'

そして、awkが私たちのためにこれを達成できる他のいくつかの方法があります。

残りの例では、次のように定義する変数を使用します範囲。 変数なしでこれを行うことはできますが(式に値をインライン化する)、変数を使用すると、コーディングの場合と同じように、コマンドを読みやすくすることができます。

さらに、変数の導入により、 awk スクリプトをそのままにして、パラメーターを介して範囲のサイズを制御できます。したがって、パラメーター化することで、スクリプト。

最初の近似に戻り、変数を使用してみましょう。

$ echo '123456789' | awk -v range="3" 'sub(sprintf("^.{%s}",range),"")'
#                                                  |____________|
#                                                         |
#           Here we compose our regular expression _______|

また、 awk に、空の文字をフィールド区切り文字と見なすように指示することもできます。 次に、目的の位置から行の終わりまでのみ、各文字の印刷を繰り返すことができます。

$ echo '123456789' | awk -F '' -v range=3 '{for (i=1; i<=NF; i++) if (i > range) printf $i; print ""}'
#                        |___| |________|
#                          |       |_____ We assign the value "3" to the variable "range"
#                          |
#                          |_________ We set the input field separator as the null string and
#                                     we let a space between the null character and the -F parameter.

これを行うためのより便利な方法は、substr関数を使用することです。

$ echo '123456789' | awk -v range=3 '{print substr($0,range+1)}'

後者の場合、 awk のデフォルトの動作は、レコード全体(変数 $ 0 に格納されている)を出力することであるため、変更することしかできません。

echo '123456789' | awk -v range=3 '$0 = substr($0,range+1)'

6. perlを使用する

perl は、Perl言語のインタープリターであり、テキスト処理に優れた機能セットをもたらします。

sed grep 、およびawksub関数の場合と同様に、で正規表現を適用できます。 perl call

$ echo '123456789' | perl -pe 's/^.{3}//'

7. パラメータ拡張の使用

BashおよびZshで使用可能なパラメーター拡張は、文字の範囲を操作するのに役立ちます。

$ var="123456789"
$ echo ${var:3}

または、 Zsh の場合のみ:

$ var="123456789"
$ echo $var[4,-1]

このアプローチの欠点は、文字ストリームからの行をカットする前に変数に割り当てる必要があることです。 そのようなことをしたい場合は、次を使用する必要があります。

$ while read var || [[ -n $var ]]; do echo ${var:3}; done < example_file.txt

または:

$ <command> | while read var || [[ -n $var ]]; do echo ${var:3}; done

8. 結論

このチュートリアルでは、GNU / Linuxが提供するいくつかのツールを使用して、文字列から最初のn文字を削除します。