Ошибка регулярного выражения при попытке сопоставить слово целиком

Вы можете сделать это с помощью команды перевода:

jent=$(echo "$d" | tr -ds  UTC "  " | tr " ",)
# the first double quotes contains two spaces 
echo "$jent"
Mon,Apr,22,05:06:00,2019
0
06.10.2020, 12:56
2 ответа

Проблема в том, что вы пытаетесь явно добиться двух вещей, которые, тем не менее, подразумевают друг друга:

  • строка должна начинаться сuser1
  • строка не должна начинаться со знака комментария(#или;)

Однако ваше второе регулярное выражение гласит: «Строка должна начинаться с любого символа, отличного от #или ;, а затем содержать user1. Итак, grepожидает, что перед user1есть символ. ] Это не проблема в первом регулярном выражении, где вы требуете «любой символ, который не является #или ;, за которым следует ser1», поскольку user1начинается с символа, который не является #или ;.

Если вы уверены, что строка начинается с user1, вы можете просто использовать

grep -P '^user1 etc.'

или, если могут быть пробелы,

grep -P '^ *user1 etc.'
3
18.03.2021, 22:59

Вы привязываете регулярное выражение к началу строки:

^[^#;]ser1

Это означает, что «соответствуют строки, начинающиеся с любого символа, отличного от #или ;, а затем строка ser1. Таким образом, [^#;]соответствует uиз user1. Если вы хотите дать слово целиком, нужно искать строки, начинающиеся с user1непосредственно:

^user1

В качестве альтернативы можно разрешить 0 вхождений шаблона [^#;]:

^[^#;]*ser1

Таким образом, ваша полная команда может быть такой:

grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

или

grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

Однако это кажется очень, очень сложным. Все, что вам действительно нужно, это:

grep -P '^[^#;]*user1'

в этом примере.

3
18.03.2021, 22:59

Теги

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