2015-09-18 3 views
0

Я хотел бы, чтобы захватить цифры в строке следующим образом:Как использовать СЭД, чтобы захватить регулярное выражение

"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' 

Я видел это ответ, в котором я получил эту идею. Use sed to grab a string, но он не работает на моей машине:

  • он дает ошибку «нелегальный вариант -r».
  • ему тоже не нравится \1.

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

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

+0

вам не нужно \ 1 для выражения вы ищете – Dalorzo

+0

-r только для GNU СЭД (тот, который поставляется с Баш) не так ли? –

ответ

-1

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

pattern "\ d + - \ d + - \ d +" соответствует тому, что вы ищете. Смотрите демо здесь

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

+0

Я считаю, что \ 1 был ссылкой на его группу соответствия. –

2

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

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

Он не будет работать на MacOSX yosemite! см. http://stackoverflow.com/questions/12178924/os-x-sed-e-doesnt-accept-extended-regular-expressions – alfasin

2

Усовершенствованные регулярные выражения: not supported в версии для Mac.

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

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

ВЫВОД

2341-43-11 
0
echo "one1sample_2341-43-11.txt" \ 
| sed 's/[^[:digit:]-]\{1,\}/ /g;s/ \{1,\}/ /g;s/^ //;s/ $//' 

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

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

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) 
Смежные вопросы