У меня есть строка, точно путь к файлу

/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt ,

Мне нужно извлечь путь к его папке,

получить /Users/dengjiangzhou/Documents/源码/198/ .

Вот что я попробовал.

echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed  's@.*\(/.+\)@\1@p' 

/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt 

Я использую группу захвата регулярных выражений, пытаюсь захватить группу один /李宏毅-机器学习2017秋季.txt и заменить ее на ,

Похоже, что группа захвата регулярных выражений имеет эффект соответствия с конца до начала.

тогда я получу

/Users/dengjiangzhou/Documents/源码/198

Я прочитал регулярное выражение Sed, снова и снова извлекая часть строки в Mac терминал .

Надеюсь, поможет, амиго

Очень хочу получить /Users/dengjiangzhou/Documents/源码/198/ ,

/Users/dengjiangzhou/Documents/源码/198 не хорошо.

любая хорошая идея?

1 ответ1

1

Первая попытка не работает, потому что escape для + отсутствует

echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed  's@.*\(/.\+\)@\1@' 
/李宏毅-机器学习2017秋季.txt 

(экранирования для метасимволов можно избежать с помощью опции -r или -E для Extended RE).

Вам нужна часть dirname, а затем просто сгруппируйте первую часть ER.

echo "/Users/dengjiangzhou/Documents/源码/198/李宏毅-机器学习2017秋季.txt " | sed  's@\(.*\)/.*@\1@' 
/Users/dengjiangzhou/Documents/源码/198

Квантификаторы в sed являются жадными, это означает, что когда вы запрашиваете совпадение с регулярным выражением типа .*/.* , первая .* будет соответствовать всей строке до конца, потому что вы просили сопоставить что-либо . в любом числе * , а / - это любое число.

edit- Если вы хотите прочитать о регулярных выражениях и sed, посмотрите https://www.regular-expressions.info/tutorial.html http://www.grymoire.com/Unix/Sed.html#uh-0

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .