Как использовать sed, чтобы получить регулярное выражение

Я хотел бы получить цифры в строке, например, так:

 "sample_2341-43-11.txt"   to   2341-43-11

И вот я попробовал следующую команду:

echo "sample_2341-43-11.txt" | sed -n -r 's|[0-9]{4}\-[0-9]{2}\-[0-9]{2}|\1|p'

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

  • выдает ошибку "незаконная опция -r".
  • это не нравится \1, или.

Я использую sed на MacOSX Yosemite.

Это самый простой способ извлечь эту информацию из имени файла?

5 ответов

Расширенные регулярные выражения не поддерживаются в версии sed для Mac.

Ты можешь использовать grep вместо:

echo "sample_2341-43-11.txt" | grep -Eo "((\d+|-)+)"

ВЫХОД

2341-43-11

Вам нужно установить свою группировку и сопоставить остальную часть строки, чтобы удалить ее с группой. Также - не нужно избегать. И -n будет запрещать вывод (он просто возвращает уровень выхода для условий скрипта).

echo "sample_2341-43-11.txt" | sed -r 's/^.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/'
echo "one1sample_2341-43-11.txt" \
 | sed 's/[^[:digit:]-]\{1,\}/ /g;s/ \{1,\}/ /g;s/^ //;s/ $//'

1 2341-43-11
  • Извлечь все числа (цифры), заполненные - (таким образом, разрешите здесь --12 но можно легко лечить)
  • посикс совместимый
  • все номера строк находятся на одной строке (если их несколько), разделенных пробелом (при желании можно изменить на новую строку)

Вы можете попробовать это также

sed 's/[^_]\+_\([^.]\+\).*/\1/' <<< sample_2341-43-11.txt

Выход:

2341-43-11

Объяснение:

[^_]\+       - Match the content untile _ ( sample_)
\([^.]\+\)   - Match the content until . and capture the pattern (2341-43-11)
.*           - Discard remaining character (.txt)

Вы можете пойти с тем, что сказал плакат выше. Ну, используя это

шаблон "\d+-\d+-\d+" будет соответствовать тому, что вы ищете. Посмотреть демо здесь

https://regex101.com/r/kO2cZ1/3

Другие вопросы по тегам