Как использовать 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+" будет соответствовать тому, что вы ищете. Посмотреть демо здесь