grep функция AND из любого места в строке [дубликат]

0
22.10.2018, 17:28
3 ответа

Это будет работать (с использованием 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
0
28.01.2020, 02:41

Если второй термин пуст или не установлен, не запускайте второй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

Это эффективно реализует " term1AND term2" и обрабатывает пустой term2как "false".

Преимущество этого заключается в том, что он опирается только на стандарт grepи что два шаблона хранятся отдельно, что облегчает понимание и поддержку.

1
28.01.2020, 02:41

Попробуйте то, что 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
0
28.01.2020, 02:41

Теги

Похожие вопросы