How to write a regex that says that given pattern is present ONLY once?
for e.g.. if am searching for pattern ‘file’,
123file345 --> Match
asdffile12 --> match
file12file --> does not match
Advertisement
Answer
You could use a negative lookahead:
^(?!(?:.*?file){2}).*?file.*$
You may apply the above regex in grep.
grep -P '^(?!(?:.*?file){2}).*?file' file
The negative lookahead assertion at ^ start (?!(?:.*?file){2}) looks ahead, if there’s not
2x ( .*? lazily any amount of any characters, followed by substring file ).
If this condition succeeds, it matches .*?file.* all string if it contains substring file.
For just matching the line the last greedy dot (to match any characters after file) is not required.
