Как извлечь строку в csh? - PullRequest
       28

Как извлечь строку в csh?

0 голосов
/ 29 февраля 2012

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

setenv VARIABLE /opt/Application/File/Version22

Я хочу отобразить только

File/Version22

на экране.Это означает, что /opt/Application/ всегда является префиксом.Я хочу отобразить остальную часть строки.Как мне сделать это в csh?

С уважением

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Теперь, когда вы обновили вопрос (спасибо за это), стало ясно, что вы всегда хотите удалить префикс /opt/Application.

Самый простой способ сделать это, который будет работать в любой оболочке, это:

echo $VARIABLE | sed 's|^/opt/Application/||'

(Обычно используется / в качестве разделителя для подобных замен, но вы можете использовать любой символ пунктуации; я использую |, чтобы избежать конфликта с / символами в шаблоне.)

Более специфичный для tcsh и, возможно, более эффективный способ сделать это:

echo $VARIABLE:s|/opt/Application/||

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

Обратите внимание, что синтаксис :s не поддерживается в исходном csh. Он поддерживается в tcsh и в некоторых новых версиях csh. Если вы хотите сделать это мобильно, просто используйте sed.

1 голос
/ 01 марта 2012

C-Shell имеет встроенные модификаторы строк, которые могут сделать это с очень небольшим кодом:

echo $VARIABLE:h:t/$VARIABLE:t

string modifiers:
:h = remove the last directory (aka head)
:t = remove every directory except the last one (aka tail)
0 голосов
/ 01 марта 2012

Я предполагаю, что вы хотите получить 2 фамилии в имени файла:

setenv VARIABLE /opt/Application/File/Version22
set lastfile=`basename $VARIABLE`
set prevpath=`dirname $VARIABLE`
set previousfile=`basename $prevpath`
set file=$previousfile/$lastfile
echo $file
...