Что здесь не так с sed?

#regex #bash #sed

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

Вопрос:

Я уже потратил много времени на sed и gsed, просто пытаясь сопоставить глупую строку, но это все еще не работает!

ни:

 echo "123adv123" | sed -En 's/([a-z] )/#/g'
  

ни:

 echo "123adv123" | sed -En 's/([a-z]*)/#/g'
  

ни:

 echo "123adv123" | sed -En 's/([a-z] )/#/g'
  

ни:

 echo "123adv123" | gsed -rn 's/([a-z] )/#/g'
  

ни:

 echo "123adv123" | gsed -rn 's/([a-z] )/#/g'
  

Я пробую это на OSX. Я знаю, что вопрос выглядит действительно странным, но я застрял и просто хочу разобраться, что здесь не так?

Вывод должен быть 123#123

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

1. Чего вы хотите достичь? Можете ли вы предоставить ожидаемый результат?

2. Вы никогда не печатаете пространство шаблона. Вы никогда не получите никаких выходных данных из этого. Отбросьте n аргумент. В качестве альтернативы, добавьте p после g , чтобы указать sed напечатать строку. Ваша последняя строка работает (с s/gsed/sed/ и удалением n аргумента) здесь, в CentOS Linux с GNU sed version 4.1.5 .

3. Удалите -n («noprint») аргумент или добавьте p («print») в свою s команду: s/a/b/gp

4. спасибо и извините за глупый вопрос, просто застрял с ним странным образом.

Ответ №1:

Вам нужно удалить -n , иначе это приведет к подавлению вывода.

Это работает на OSX:

 echo "123adv123" | sed 's/([a-z][a-z]*)/#/g'
  

Итак, это:

 echo "123adv123" | gsed -r 's/([a-z] )/#/g'
  

Или это:

 echo "123adv123" | sed -E 's/([a-z] )/#/g'
  

Или для печати только замененных строк используйте:

 sed -nE 's/([a-z] )/#/pg' file
  

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

1. Я думал, это для подавления несогласованных строк. Хорошо, если я удалю его, как я буду подавлять строки без сопоставления?

2. Вы можете использовать: sed -nE 's/([a-z] )/#/pg' file