Это будет работать (с использованием GNUgrep
):
grep -P '(?<=new)\s(?=line)' file
Тест:
$ cat > file
I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new
^D
$ grep -P '(?<=new)\s(?=line)' file
I have this new line now
I don't have this other new line
Если второй термин пуст или не установлен, не запускайте второйgrep
:
grep -e "$term1" <file |
if [ -n "$term2" ]; then
grep -e "$term2"
else
cat
fi
Это применяется grep
с шаблоном в $term1
к файлу с именем file
, а затем, в зависимости от того, является ли $term2
не пустым -, применяется второй grep
к результату или используется cat
как проход -через фильтр.
Обратите внимание, что это эффективно реализует " term1
И term2
", за исключением случаев, когда term2
пусто, в котором оно вырождается в просто " term1
".
Если вы вообще не хотите запускать grep
и вместо этого возвращаете пустой результат, когда второй термин пуст:
if [ -n "$term2" ]; then
grep -e "$term1" <file | grep -e "$term2"
fi
Это эффективно реализует " term1
AND term2
" и обрабатывает пустой term2
как "false".
Преимущество этого заключается в том, что он опирается только на стандарт grep
и что два шаблона хранятся отдельно, что облегчает понимание и поддержку.
Попробуйте то, что man grep
называет "конкатенацией" в сочетании с "чередованием":
P1=line
P2=new
grep "$P1.*$P2\|$P2.*$P1" file
I have this new line now
I don't have this other new line
This line is new