Если вы хотите удалить определенное количество компонентов пути, вы должны использовать cut
с -d'/'
.Например, если path=/home/dude/some/deepish/dir
:
Для того, чтобы удалить первые два компонента:
# (Add 2 to the number of components to remove to get the value to pass to -f)
$ echo $path | cut -d'/' -f4-
some/deepish/dir
Чтобы сохранить первые два компонента:
$ echo $path | cut -d'/' -f-3
/home/dude
Для того, чтобы удалить последние два компонента (rev
переворачивает строку) :
$ echo $path | rev | cut -d'/' -f4- | rev
/home/dude/some
Чтобы сохранить последние три компонента Энты:
$ echo $path | rev | cut -d'/' -f-3 | rev
some/deepish/dir
Или, если вы хотите, чтобы удалить все до определенного компонента, sed
будет работать:
$ echo $path | sed 's/.*\(some\)/\1/g'
some/deepish/dir
Или после определенного компонента:
$ echo $path | sed 's/\(dude\).*/\1/g'
/home/dude
Это даже проще, если вы не хотите содержать компонент, который вы указываете:
$ echo $path | sed 's/some.*//g'
/home/dude/
И если вы хотите, чтобы быть последовательными вы можете сопоставить слэш тоже:
$ echo $path | sed 's/\/some.*//g'
/home/dude
Конечно, если вы соответствие несколько косую черту, вы должны переключить sed
разделитель:
$ echo $path | sed 's!/some.*!!g'
/home/dude
Обратите внимание, что в этих примерах используются абсолютные пути, вам придется поиграть, чтобы заставить их работать с относительными путями.
Спасибо ... Да, я использую переменные оболочки для выполнения этого. Обе части - это переменные, которые мне нужно удалить и полный путь. – esausilva
Отлично! Но как я могу использовать это, когда строка идет «из трубы»? – gromit190
@Birger, если строка исходит из трубы, тогда вам нужно получить ее в переменной, чтобы использовать расширение оболочки. Или просто используйте 'sed' в этом случае. –