
1つ以上のインスタンスを含むが他の数字は含まないファイルの行を検索しようとします1234
(数値以外の文字は許可されています)。他の数字を使用すると、行が一致しなくなります。
有効な例:
1234
1234 xxx
xxx 1234
1234 1234
1234 xxx 1234
無効な例:
12341234
12345
1234xxx345
1234 345
1234xxx
xxx1234
1234xxx1234
これが私が使用したものです:
grep -E '^([^0-9]*1234)+[^0-9]*$' file.txt
ただし、このコマンドは有効な12341234も出力します。これを防ぐにはどうすればよいですか?
答え1
awk
grep
これよりも便利かもしれません。フィールド区切り文字を数字以外の連続文字に設定してからフィールドを繰り返し、空でない各フィールドが正確に次の場合にのみ行を印刷します。1234
awk -F'[^[:digit:]]+' '{
for(i=1; i<=NF; ++i)
if (($i) && ($i != 1234)) next
}; {print}' file.txt
答え2
grep -E '^[^0-9]*1234([^0-9]+1234)*[^0-9]*$' file.txt
説明する
^[^0-9]*1234
:最初の一致が見つかりました1234
。前に数字以外の文字が続くことがあります。([^0-9]+1234)*
:追加の繰り返しがあるかもしれませんが、数字以外の文字で最初1234
(および他の繰り返し)と区別する必要があります1234
(したがって使用)。1234
+
[^0-9]*$
:フルライン(バンド$
)と一致します。最後の後に数字以外の文字があるかもしれません1234
(しかし必ずしもそうではありません*
)。
編集する
1234
スペース(または行の先頭または末尾)で区切る必要がある場合は、次のようにします。
grep -E '^([^0-9]* )?1234(( [^0-9]*)? 1234)*( [^0-9]*)?$'
説明する
^([^0-9]* )?
: 空白で終わる限り、数字以外の文字で始めることができます。1234
:最初の(必須)一致が見つかりました1234
。(( [^0-9]*)? 1234)*
:角かっこを逆さまに繰り返します。追加のコピーが(0個以上)ある場合がありますが、1234
前にはスペースが必要です(例:)1234
。この空白の前には数字以外の文字を含めることができます。ただし、これらの文字は1243
他の空白(たとえば)で古いコピーと区別する必要があります( [^0-9]*)?
。( [^0-9]*)?$
: 前にスペースがある場合は、末尾に数字以外の文字を使用できます。
答え3
数字検索の先頭または前に^
数字ではない()があり[^0-9]
、末尾($
または[^0-9]
)にあります。
grep -E '(^|[^0-9])1234($|[^0-9])' file.txt
先頭にゼロを許可するには、0*
数字の前に追加してください。
grep -E '(^|[^0-9])0*1234($|[^0-9])' file.txt
特定の数字の発生の一部ではない一連の数字を含む行も拒否するには、その特定の数字と交互に表示される1つ以上の数字ではないシーケンスで構成される行を見つける必要があります。 、つまり基本的に([^0-9]+1234)*
。行は数字または数字以外の文字で始まり終わることができ、数字以外の数字の内部シーケンスは空白にできません。また、行には複数の数字を含める必要があります。一緒に入れてください:
grep -xE '[^0-9]*1234([^0-9]+1234)*[^0-9]*' file.txt