У меня возникли проблемы с тем, что кажется простым регулярным выражением для удаления строк с помощью sed

#regex #sed

#регулярное выражение #sed

Вопрос:

Когда я grep использую ^[0-9{7}]* , он обнаруживает все нужные мне строки. Но когда я запускаю это, оно просто удаляет все.

Я не могу найти ссылку для правильного экранирования команды sed. Я знаю, что это тоже момент RTFM : (

sed '/^[0-9{7}]*/d' simple.txt

 4216333 2018-06-11T17:27:16-0500    446421648264    140843
4153130 2018-06-11T17:27:15-0500    446421650974    142398
4154997 2018-06-11T17:27:15-0500    446421650985    142399
4155087 2018-06-11T17:27:15-0500    446421650996    142400
4155543 2018-06-11T17:27:15-0500    446421651000    142401
4155615 2018-06-11T17:27:15-0500    446421651010    142402
4155650 2018-06-11T17:27:15-0500    446421651021    142403
4155681 2018-06-11T17:27:14-0500    446421651032    142404
  

Ответ №1:

^[0-9{7}]* Шаблон соответствует строке, которая начинается с 0 или более цифр, { или } символов. Таким образом, оно соответствует любой строке.

Чтобы удалить строки, начинающиеся с 7 цифр, вы можете использовать следующую команду sed на основе POSIX BRE:

 sed '/^[0-9]{7}/d' simple.txt
  

Или с шаблоном POSIX ERE (где {x} квантификатор не требует экранирования):

 sed -E '/^[0-9]{7}/d' simple.txt
  

Обратите внимание, что в случае, если вы хотите опустить все строки, где первый фрагмент без пробелов не равен 7 цифрам, его удобнее использовать awk :

 awk '$1 !~ /^[0-9]{7}$/' simple.txt
  

С sed (BRE POSIX, без -E опции) это будет выглядеть как /^[0-9]{7}[[:blank:]]/d , /^[0-9]{7}[[:space:]]/d , /^[0-9]{7}>/d /^[0-9]{7}b/d .

Комментарии:

1. Я думаю, мой вопрос следует изменить. Мне любопытно, где вы нашли всю эту информацию? Есть ли ресурсы, чтобы узнать, какую команду в sed следует экранировать? Спасибо вам за это.

2. @CGSmith105 Извините, что следует изменить? Судя по текущему вопросу, вы неправильно понимаете, как кодировать последовательности шаблонов. Помещение всего в квадратные скобки может привести к ошибке шаблона или будет просто соответствовать одному символу, принадлежащему набору.

3. Ничего не должно быть изменено. Как вы узнали, какие символы нужно экранировать?

4. @CGSmith105 Вот хорошая статья о разнице между BRE и ERE.