最後または最後の2文字、または最初または2番目の文字を除くすべての数字を含む行のみを印刷します。

最後または最後の2文字、または最初または2番目の文字を除くすべての数字を含む行のみを印刷します。

すべての数字、すべての文字、および文字を含む行を含む大きなテキストファイルがあり、ここには数字、文字、および文字を含む行も含まれています。最後または最後の2文字を除いて、含まれているすべての数字を印刷したいと思います。 。

  1. 数字で始まるが最後の文字または数字ではなく、最後の2文字で終わる行を印刷します。例えば

    1234567a
    2245678902da
    A1234566d
    12345678abc
    

    出力は次のようになります。

    1234567a
    22345678902da
    
  2. 最初の文字を除くすべての文字が数字の行、または最初と2番目の文字が数字以外の行を印刷します。例えば

    A1234
    Ab1234
    1a1234
    Abc1234
    

    出力は次のようになります。

    A1234
    Ab1234
    

ありがとう

答え1

$ grep -Ex '[[:digit:]]+(.|[^[:digit:]]{2})' file1
1234567a
2245678902da

拡張正規表現は、[[:digit:]]+(.|[^[:digit:]]{2})1つ以上の数字の後に指定されていない文字または2つの数字以外の数字が続くものと一致します(仕様の文字通りの解釈は「数字で始まりますが、最後の文字または数字ではなく、最後の2文字で終わります"). この-xオプションを使用するgrepと、一致が行全体に表示されます。

指定した内容のリテラル解釈は、以下を含む行とも一致します。ただ数字。

そして

$ grep -Ex '[^[:digit:]]{1,2}[[:digit:]]+' file2
A1234
Ab1234

1 つまたは 2 つの数字ではなく数字で始まり、行の最後まで 1 つ以上の数字を含む行を一致させます。


2つの正規表現の視覚的表現(使用方法も表示sed):

最初:

$ sed -nE 's/^([[:digit:]]+)(.|[^[:digit:]]{2})$/(\1)(\2)/p' file1
(234567)(a)
(2245678902)(da)

第二:

$ sed -nE 's/^([^[:digit:]]{1,2})([[:digit:]]+)$/(\1)(\2)/p' file2
(A)(1234)
(Ab)(1234)

解決策は、コマンドからすべての括弧を削除することでsed見つけることができます。sed

答え2

説明が若干異なります。最後の1〜2文字は数字にすることができないので、これを読みました。

grep -E '^[[:digit:]]+[^[:digit:]]{1,2}$' file
1234567a
2245678902da

答え3

以下の最初の質問に対するコマンドは次のとおりです。

sed -n '/^[0-9]*[a-z]\{,2\}$/p' filename

出力

1234567a
2245678902da

以下の2番目の質問に対するコマンドは次のとおりです。

 sed -n '/^[A-Za-z]\{1,2\}[0-9]*$/p'

出力:

A1234
Ab1234

関連情報